Maison >base de données >tutoriel mysql >Comment récupérer l'heure d'arrivée/de départ la plus récente pour chaque utilisateur dans une base de données ?

Comment récupérer l'heure d'arrivée/de départ la plus récente pour chaque utilisateur dans une base de données ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-13 12:46:44375parcourir

How to Retrieve the Most Recent Check-in/Out Time for Each User in a Database?

Extraction de la dernière heure d'arrivée/départ par utilisateur

Énoncé du problème :

La tâche consiste à créer une vue de base de données affichant l'heure d'arrivée/départ la plus récente de chaque utilisateur, y compris le statut « entrée » ou « sortie » correspondant à partir de la table lms_attendance.

Approche initiale et ses limites :

Une première tentative utilisée GROUP BY à la fois sur l'utilisateur et sur le statut "entrée/sortie" (colonne io). Cette approche ne parvenait pas à gérer les scénarios dans lesquels un utilisateur disposait de plusieurs enregistrements avec le même horodatage maximum, ce qui entraînait des entrées en double pour ces utilisateurs. La requête erronée était :

<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>

Solutions efficaces :

Deux solutions sont présentées pour résoudre ce problème :

Solution 1 : Gestion de plusieurs durées maximales :

Cette requête renvoie toutes les lignes représentant les derniers horodatages pour chaque utilisateur, même si plusieurs enregistrements partagent la même durée maximale :

<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>

Solution 2 : Garantir une seule ligne par utilisateur :

Si un seul enregistrement par utilisateur est requis, quelles que soient les durées maximales de duplication potentielles, cette requête est préférable. Il sélectionne l'enregistrement avec l'ID le plus élevé (en supposant id des incréments automatiques, reflétant l'entrée la plus récente) :

<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.time DESC, t2.id DESC
                 LIMIT 1)</code>

Cette requête révisée utilise ORDER BY t2.time DESC, t2.id DESC pour donner la priorité à l'heure la plus récente, puis à l'ID le plus élevé en cas d'égalité, garantissant ainsi un résultat unique et définitif par utilisateur.

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