Maison >base de données >tutoriel mysql >Comment sélectionner efficacement l'enregistrement le plus récent pour chaque utilisateur dans une base de données ?
Une tâche fréquente de base de données consiste à sélectionner l'entrée la plus récente pour chaque utilisateur unique. Considérez le tableau lms_attendance
, qui suit les heures d'arrivée et de départ des utilisateurs.
La structure du tableau lms_attendance
est :
id | user | time | io |
---|---|---|---|
1 | 9 | 1370931202 | out |
2 | 9 | 1370931664 | out |
3 | 6 | 1370932128 | out |
4 | 12 | 1370932128 | out |
5 | 12 | 1370933037 | in |
Notre objectif est de générer une requête qui renvoie uniquement l'enregistrement le plus récent pour chaque utilisateur, reflétant avec précision son io
statut actuel (entré ou sorti).
Une approche naïve pourrait être :
<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>
Cependant, cela produit des résultats incorrects :
id | user | time | io |
---|---|---|---|
3 | 6 | 1370932128 | out |
1 | 9 | 1370931664 | out |
5 | 12 | 1370933037 | in |
4 | 12 | 1370932128 | out |
Le time
est correct, mais le statut io
n'est pas toujours associé à l'horodatage le plus récent.
La solution réside dans l'utilisation d'une sous-requête pour identifier le maximum time
pour chaque utilisateur. La requête améliorée est :
<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>
Cette requête rejoint efficacement la table avec une sous-requête qui trouve le maximum time
pour chaque utilisateur. Seuls les enregistrements correspondant au dernier horodatage sont sélectionnés, garantissant ainsi un io
statut précis pour l'entrée la plus récente de chaque utilisateur.
Les sous-requêtes sont des outils puissants pour la récupération de données complexes. Cet exemple démontre leur efficacité dans la sélection efficace de l'enregistrement le plus récent par utilisateur unique, une technique précieuse pour l'analyse des données et la création de rapports.
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!