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 ?

Comment sélectionner efficacement l'enregistrement le plus récent pour chaque utilisateur dans une base de données ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-13 12:56:44531parcourir

How to Efficiently Select the Most Recent Record for Each User in a Database?

Récupération du dernier enregistrement pour chaque utilisateur

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.

Le défi : trouver la dernière entrée

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 simple (mais imparfaite)

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 efficace : utiliser une sous-requête

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.

Résumé

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!

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