Eine häufige Datenbankaufgabe besteht darin, für jeden einzelnen Benutzer den aktuellsten Eintrag auszuwählen. Betrachten Sie die lms_attendance
-Tabelle, die die Check-in- und Check-out-Zeiten der Benutzer verfolgt.
Die lms_attendance
Tabellenstruktur ist:
id | user | time | io |
---|---|---|---|
1 | 9 | 1370931202 | out |
2 | 9 | 1370931664 | out |
3 | 6 | 1370932128 | out |
4 | 12 | 1370932128 | out |
5 | 12 | 1370933037 | in |
Unser Ziel ist es, eine Abfrage zu generieren, die nur den neuesten Datensatz für jeden Benutzer zurückgibt und dessen aktuellen io
Status (ein- oder ausgegangen) genau widerspiegelt.
Ein naiver Ansatz könnte sein:
<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>
Dies führt jedoch zu falschen Ergebnissen:
id | user | time | io |
---|---|---|---|
3 | 6 | 1370932128 | out |
1 | 9 | 1370931664 | out |
5 | 12 | 1370933037 | in |
4 | 12 | 1370932128 | out |
Der time
ist korrekt, aber der io
-Status ist nicht immer mit dem neuesten Zeitstempel verknüpft.
Die Lösung besteht darin, eine Unterabfrage zu verwenden, um das Maximum time
für jeden Benutzer zu ermitteln. Die verbesserte Abfrage lautet:
<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>
Diese Abfrage verknüpft die Tabelle effizient mit einer Unterabfrage, die das Maximum time
für jeden Benutzer ermittelt. Es werden nur die Datensätze ausgewählt, die mit dem neuesten Zeitstempel übereinstimmen, um einen genauen io
Status für den letzten Eintrag jedes Benutzers sicherzustellen.
Unterabfragen sind leistungsstarke Tools für den komplexen Datenabruf. Dieses Beispiel zeigt ihre Wirksamkeit bei der effizienten Auswahl des neuesten Datensatzes pro einzelnem Benutzer, einer wertvollen Technik für die Datenanalyse und Berichterstellung.
Das obige ist der detaillierte Inhalt vonWie wählt man effizient den neuesten Datensatz für jeden Benutzer in einer Datenbank aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!