Heim >Datenbank >MySQL-Tutorial >Wie rufe ich den aktuellsten Check-in/Check-out-Datensatz pro Benutzer in einer Datenbank ab?

Wie rufe ich den aktuellsten Check-in/Check-out-Datensatz pro Benutzer in einer Datenbank ab?

DDD
DDDOriginal
2025-01-13 12:51:42131Durchsuche

How to Retrieve the Most Recent Check-in/Check-out Record per User in a Database?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn