Maison > Article > base de données > Comment récupérer la participation la plus récente de chaque membre dans 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!