Maison >base de données >tutoriel mysql >Comment récupérer l'enregistrement d'arrivée/départ le plus récent par utilisateur dans une base de données ?

Comment récupérer l'enregistrement d'arrivée/départ le plus récent par utilisateur dans une base de données ?

DDD
DDDoriginal
2025-01-13 12:51:42122parcourir

How to Retrieve the Most Recent Check-in/Check-out Record per User in a Database?

Extraction des dernières données d'enregistrement/départ de l'utilisateur

Les tables de base de données stockent souvent les horodatages d'arrivée et de départ des utilisateurs. Récupérer uniquement l'entrée la plus récente pour chaque utilisateur nécessite une construction de requête minutieuse. Une approche naïve pourrait donner des résultats en double.

Régler la duplication des données

Considérez cette première tentative :

<code class="language-sql">select 
    `lms_attendance`.`id` AS `id`,
    `lms_attendance`.`user` AS `user`,
    max(`lms_attendance`.`time`) AS `time`,
    `lms_attendance`.`io` AS `io` 
from `lms_attendance` 
group by 
    `lms_attendance`.`user`, 
    `lms_attendance`.`io`</code>

Bien que cette requête recherche l'heure la plus récente pour chaque utilisateur, elle peut renvoyer plusieurs lignes par utilisateur s'ils ont à la fois des entrées « d'entrée » et « de sortie » à des moments différents.

La solution de sous-requête

Une solution plus robuste utilise une sous-requête pour identifier l'horodatage maximum pour chaque utilisateur :

<code class="language-sql">SELECT t1.*
FROM lms_attendance t1
WHERE t1.time = (SELECT MAX(t2.time)
                 FROM lms_attendance t2
                 WHERE t2.user = t1.user)</code>

Cela filtre efficacement les résultats pour afficher uniquement l'enregistrement le plus récent en fonction de la colonne time pour chaque utilisateur. Notez que si un utilisateur a à la fois des entrées « in » et « out » avec le même horodatage le plus récent, cette requête renverra les deux.

Priorité au dernier enregistrement (indépendamment de « entrée / sortie »)

Si un seul enregistrement par utilisateur est nécessaire, quel que soit le statut "in" ou "out", cette requête est préférable :

<code class="language-sql">SELECT t1.*
FROM lms_attendance t1
WHERE t1.id = (SELECT t2.id
                 FROM lms_attendance t2
                 WHERE t2.user = t1.user            
                 ORDER BY t2.id DESC
                 LIMIT 1)</code>

Cette approche sélectionne l'enregistrement avec le id le plus élevé, en supposant id des incréments automatiques et représente ainsi l'entrée la plus récente.

En utilisant ces requêtes affinées, vous pouvez récupérer avec précision les données d'enregistrement/départ les plus récentes pour chaque utilisateur sans informations redondantes. Le choix entre les deux dernières requêtes dépend de la nécessité de prendre en compte le statut « entrant » ou « sortant » lors de la détermination de l'enregistrement le plus récent.

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