Maison > base de données > tutoriel mysql > le corps du texte

Comment récupérer le dernier enregistrement de présence de chaque membre dans MySQL ?

Linda Hamilton
Libérer: 2024-10-31 12:49:02
original
335 Les gens l'ont consulté

How to Retrieve the Last Attendance Record for Each Member in MySQL?

Sélection de la dernière valeur pour chaque groupe à l'aide de MySQL

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;
Copier après la connexion

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;
Copier après la connexion

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;
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal