Introduction
Dans votre table MySQL, vous avez des données sur l'événement présence, et vous souhaitez récupérer la dernière présence enregistrée pour chaque membre. Malgré l'utilisation d'une clause GROUP BY, vous rencontrez un problème où la première participation est sélectionnée au lieu de la dernière. Explorons comment résoudre ce problème.
Utilisation d'une sous-requête et ORDER BY
Une approche consiste à utiliser une sous-requête et ORDER BY pour sélectionner la dernière participation de chaque membre. :
SELECT id_branch_channel, id_member, attendance, timestamp, id_member FROM ( SELECT * FROM view_event_attendance ORDER BY timestamp DESC ) AS t1 WHERE id_event = 782 GROUP BY id_event, id_member;
Cette requête récupère toutes les lignes de la table view_event_attendance, les classe par horodatage par ordre décroissant (c'est-à-dire la plus récente en premier), puis utilise une sous-requête comme source pour la requête principale. La clause GROUP BY permet de regrouper les résultats par membre et de sélectionner la dernière participation.
JOINing avec une sous-requête
Une autre option consiste à utiliser un JOIN avec une sous-requête qui trouve l'horodatage maximum pour chaque membre :
SELECT t1.id_branch_channel, t1.id_member, t1.attendance, t1.timestamp, t1.id_member FROM view_event_attendance AS t1 JOIN ( SELECT id_member, MAX(timestamp) AS max_timestamp FROM view_event_attendance GROUP BY id_member ) AS t2 ON t1.id_member = t2.id_member AND t1.timestamp = t2.max_timestamp WHERE t1.id_event = 782;
Dans cette requête, la table view_event_attendance est alias t1 et est jointe à une sous-requête (alias t2) qui calcule l'horodatage maximum pour chaque membre. La condition JOIN fait correspondre les lignes en fonction de l'ID du membre et de l'horodatage maximum, garantissant que seule la dernière participation de chaque membre est incluse dans les résultats.
Utilisation de l'agrégation et de la sous-chaîne personnalisées
Une solution plus efficace consiste à utiliser une agrégation et une sous-chaîne personnalisées au lieu de sous-requêtes :
SELECT id_branch_channel, id_member, substring(max(concat(from_unixtime(timestamp), attendance)) from 20) as attendance FROM view_event_attendance WHERE id_event = 782 GROUP BY id_event, id_member;
Cette requête combine l'horodatage et la présence en une seule chaîne pour chaque ligne et utilise max() pour sélectionner le valeur maximale au sein de chaque groupe membre. La fonction substring() extrait ensuite la partie présence de la chaîne concaténée. Cette approche évite la surcharge de performances associée aux sous-requêtes.
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!