Maison  >  Article  >  base de données  >  Comment récupérer la participation la plus récente de chaque membre dans MySQL ?

Comment récupérer la participation la plus récente de chaque membre dans MySQL ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-01 04:35:28502parcourir

How to Retrieve the Most Recent Attendance for Each Member in MySQL?

Sélectionnez uniquement la dernière valeur en utilisant Group By dans MySQL

Lorsque vous essayez de récupérer la participation la plus récente de chaque membre d'une table, vous peut rencontrer une situation où vous récupérez la participation initiale au lieu de la dernière à l'aide d'une simple requête GROUP BY. Pour résoudre ce problème, il existe plusieurs approches :

Utilisation d'une sous-requête

Vous pouvez utiliser une sous-requête pour trouver l'horodatage maximum pour chaque membre, puis rejoindre la table d'origine sur cet horodatage pour récupérer la fréquentation correspondante :

<code class="sql">SELECT 
  id_branch_channel, id_member, attendance, timestamp, id_member
FROM view_event_attendance AS t1
WHERE id_event = 782
  AND timestamp = (
    SELECT 
      MAX(timestamp)
    FROM view_event_attendance AS t2 
    WHERE t1.id_member = t2.id_member 
      AND t1.id_event = t2.id_event 
    GROUP BY id_event, id_member
  )
OR timestamp IS NULL
GROUP BY id_event, id_member;</code>

Utilisation d'une table dérivée

Vous pouvez créer une table dérivée qui classe les lignes par horodatage par ordre décroissant et puis utilisez cette table comme source pour votre requête GROUP BY :

<code class="sql">SELECT id_branch_channel, id_member, attendance, timestamp, id_member 
FROM (
  SELECT 
    id_branch_channel, id_member, attendance, timestamp, id_member
  FROM view_event_attendance 
  WHERE id_event = 782 
  ORDER BY timestamp DESC
) AS sorted
GROUP BY id_event, id_member;</code>

Utilisation d'une fonction de fenêtre

Vous pouvez utiliser une fonction de fenêtre pour trouver la valeur maximale dans lignes pour chaque membre, puis utilisez cette valeur maximale pour filtrer les lignes :

<code class="sql">SELECT 
  id_branch_channel, id_member, attendance, timestamp, id_member
FROM (
  SELECT 
    id_branch_channel, id_member, attendance, timestamp, id_member,
    MAX(timestamp) OVER (PARTITION BY id_event, id_member) AS max_timestamp
  FROM view_event_attendance 
  WHERE id_event = 782
) AS subquery
WHERE timestamp = max_timestamp
GROUP BY id_event, id_member;</code>

Utilisation d'une astuce de concaténation de chaînes

Cette approche consiste à concaténer l'horodatage et la présence dans une seule chaîne et en utilisant la fonction MAX() pour trouver la plus grande chaîne. En extrayant la fréquentation de la chaîne maximale, vous récupérez efficacement la dernière fréquentation :

<code class="sql">SELECT 
  id_branch_channel, id_member, 
  SUBSTR(MAX(CONCAT(FROM_UNIXTIME(timestamp), attendance)), 20) AS attendance, timestamp, id_member
FROM view_event_attendance 
WHERE id_event = 782 
GROUP BY id_event, id_member;</code>

La meilleure approche pour votre situation spécifique dépend des caractéristiques de performances de votre base de données et de la taille de votre ensemble de données.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn