Maison >base de données >tutoriel mysql >Comment sélectionner la ligne la plus récente par utilisateur dans une base de données avec horodatages ?
Défi :
Sélectionner efficacement l'enregistrement le plus récent pour chaque utilisateur dans une table de base de données contenant des horodatages et des indicateurs d'état (« entrée » ou « sortie ») peut être complexe, en particulier lorsqu'un utilisateur a plusieurs entrées partageant le même dernier horodatage.
Approche :
Ce problème est résolu à l'aide de deux requêtes SQL distinctes :
1. Requête de plusieurs enregistrements correspondants :
Cette requête identifie tous les enregistrements avec 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>
Sortie :
ID | USER | TIME | IO |
---|---|---|---|
2 | 9 | 1370931664 | out |
3 | 6 | 1370932128 | out |
5 | 12 | 1370933037 | in |
2. Requête pour un seul enregistrement correspondant :
Cette requête renvoie uniquement l'enregistrement le plus récent par utilisateur, en donnant la priorité à l'ID le plus élevé en cas de liens d'horodatage.
<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>
Sortie :
ID | USER | TIME | IO |
---|---|---|---|
2 | 9 | 1370931664 | out |
3 | 6 | 1370932128 | out |
5 | 12 | 1370933037 | in |
Explication :
MAX(time)
) pour chaque utilisateur, puis récupère toutes les entrées correspondant à cet horodatage. Cela gère les situations où plusieurs enregistrements ont le même horodatage le plus récent.ORDER BY time DESC, id DESC
pour donner la priorité au dernier horodatage, puis à l'ID le plus élevé, garantissant ainsi qu'un enregistrement unique et définitif le plus récent est sélectionné à l'aide de LIMIT 1
.Le choix entre ces requêtes dépend de si vous avez besoin de tous les enregistrements avec le dernier horodatage ou uniquement de l'enregistrement le plus récent par utilisateur. La deuxième requête offre une solution plus concise lorsqu'un seul enregistrement est requis.
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!