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 ?
É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!