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