Heim > Datenbank > MySQL-Tutorial > Wie rufe ich die letzte Check-in-/Out-Zeit für jeden Benutzer in einer Datenbank ab?

Wie rufe ich die letzte Check-in-/Out-Zeit für jeden Benutzer in einer Datenbank ab?

Mary-Kate Olsen
Freigeben: 2025-01-13 12:46:44
Original
381 Leute haben es durchsucht

How to Retrieve the Most Recent Check-in/Out Time for Each User in a Database?

Extrahieren der letzten Check-in-/Check-out-Zeit pro Benutzer

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage