Problemstellung:
Die Aufgabe besteht darin, eine Datenbankansicht zu erstellen, die die letzte Check-in-/Check-out-Zeit jedes Benutzers anzeigt, einschließlich des entsprechenden „In“- oder „Out“-Status aus der lms_attendance
-Tabelle.
Erstansatz und seine Einschränkungen:
Ein erster Versuch, der GROUP BY
sowohl für den Benutzer als auch für den Status „Ein/Aus“ verwendet wurde (Spalte io
). Dieser Ansatz konnte Szenarien nicht bewältigen, in denen ein Benutzer über mehrere Datensätze mit demselben maximalen Zeitstempel verfügte, was zu doppelten Einträgen für diese Benutzer führte. Die fehlerhafte Abfrage war:
<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>
Effektive Lösungen:
Es werden zwei Lösungen zur Behebung dieses Problems vorgestellt:
Lösung 1: Umgang mit mehreren Maximalzeiten:
Diese Abfrage gibt alle Zeilen zurück, die die neuesten Zeitstempel für jeden Benutzer darstellen, auch wenn mehrere Datensätze dieselbe maximale Zeit haben:
<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>
Lösung 2: Garantieren einer einzelnen Zeile pro Benutzer:
Wenn nur ein Datensatz pro Benutzer erforderlich ist, unabhängig von möglichen maximalen Duplikatzeiten, ist diese Abfrage vorzuziehen. Es wählt den Datensatz mit der höchsten ID aus (unter der Annahme, dass id
automatische Inkremente den neuesten Eintrag widerspiegelt):
<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>
Diese überarbeitete Abfrage verwendet ORDER BY t2.time DESC, t2.id DESC
, um die späteste Zeit und dann die höchste ID bei Gleichstand zu priorisieren und so ein einziges, endgültiges Ergebnis pro Benutzer sicherzustellen.
Das obige ist der detaillierte Inhalt vonWie rufe ich die letzte Check-in-/Out-Zeit für jeden Benutzer in einer Datenbank ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!