Extrahieren der neuesten Benutzer-Check-in-/Check-out-Daten
Datenbanktabellen speichern häufig die Check-in- und Check-out-Zeitstempel der Benutzer. Um nur den neuesten Eintrag für jeden Benutzer abzurufen, ist eine sorgfältige Abfrageerstellung erforderlich. Ein naiver Ansatz könnte zu doppelten Ergebnissen führen.
Bekämpfung der Datenduplizierung
Betrachten Sie diesen ersten Versuch:
<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>
Während diese Abfrage die späteste Zeit für jeden Benutzer findet, kann sie mehrere Zeilen pro Benutzer zurückgeben, wenn sie zu unterschiedlichen Zeiten sowohl „In“- als auch „Out“-Einträge haben.
Die Unterabfragelösung
Eine robustere Lösung verwendet eine Unterabfrage, um den maximalen Zeitstempel für jeden Benutzer zu ermitteln:
<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>
Dadurch werden die Ergebnisse effektiv gefiltert, um nur den neuesten Datensatz basierend auf der Spalte time
für jeden Benutzer anzuzeigen. Beachten Sie, dass diese Abfrage beide zurückgibt, wenn ein Benutzer sowohl „in“- als auch „out“-Einträge mit demselben letzten Zeitstempel hat.
Priorisierung des neuesten Datensatzes (unabhängig von „in“/„out“)
Wenn nur ein einziger Datensatz pro Benutzer benötigt wird, unabhängig vom Status „in“ oder „out“, ist diese Abfrage vorzuziehen:
<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>
Dieser Ansatz wählt den Datensatz mit dem höchsten id
aus, vorausgesetzt id
automatische Inkrementierung und stellt somit den neuesten Eintrag dar.
Durch die Verwendung dieser verfeinerten Abfragen können Sie die neuesten Check-in-/Check-out-Daten für jeden Benutzer ohne redundante Informationen genau abrufen. Die Wahl zwischen den letzten beiden Abfragen hängt davon ab, ob Sie bei der Ermittlung des aktuellsten Datensatzes den Status „in“ oder „out“ berücksichtigen müssen.
Das obige ist der detaillierte Inhalt vonWie rufe ich den aktuellsten Check-in/Check-out-Datensatz pro Benutzer in einer Datenbank ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!