Heim  >  Artikel  >  Datenbank  >  Wie rufe ich den letzten Anwesenheitsdatensatz für jedes Mitglied in MySQL ab?

Wie rufe ich den letzten Anwesenheitsdatensatz für jedes Mitglied in MySQL ab?

Linda Hamilton
Linda HamiltonOriginal
2024-10-31 12:49:02269Durchsuche

How to Retrieve the Last Attendance Record for Each Member in MySQL?

Auswählen des letzten Werts für jede Gruppe mit MySQL

Einführung

In Ihrer MySQL-Tabelle befinden sich Daten zu Ereignissen Anwesenheit und Sie möchten die zuletzt für jedes Mitglied erfasste Anwesenheit abrufen. Trotz der Verwendung einer GROUP BY-Klausel tritt ein Problem auf, bei dem die erste Anwesenheit statt der letzten ausgewählt wird. Lassen Sie uns untersuchen, wie Sie dieses Problem angehen können.

Verwenden einer Unterabfrage und ORDER BY

Ein Ansatz besteht darin, eine Unterabfrage und ORDER BY zu verwenden, um die letzte Anwesenheit für jedes Mitglied auszuwählen :

SELECT id_branch_channel, id_member, attendance, timestamp, id_member
FROM (
    SELECT *
    FROM view_event_attendance
    ORDER BY timestamp DESC
) AS t1
WHERE id_event = 782
GROUP BY id_event, id_member;

Diese Abfrage ruft alle Zeilen aus der Tabelle „view_event_attendance“ ab, ordnet sie nach Zeitstempel in absteigender Reihenfolge (d. h. die aktuellsten zuerst) und verwendet dann eine Unterabfrage als Quelle für die Hauptabfrage. Die GROUP BY-Klausel wird verwendet, um die Ergebnisse nach Mitglied zu gruppieren und die letzte Anwesenheit auszuwählen.

JOINing mit einer Unterabfrage

Eine andere Möglichkeit besteht darin, einen JOIN mit einer Unterabfrage zu verwenden Dadurch wird der maximale Zeitstempel für jedes Mitglied ermittelt:

SELECT 
    t1.id_branch_channel,
    t1.id_member, 
    t1.attendance, 
    t1.timestamp,
    t1.id_member
FROM view_event_attendance AS t1
JOIN (
    SELECT id_member, MAX(timestamp) AS max_timestamp
    FROM view_event_attendance
    GROUP BY id_member
) AS t2 ON t1.id_member = t2.id_member AND t1.timestamp = t2.max_timestamp
WHERE t1.id_event = 782;

In dieser Abfrage wird die Tabelle „view_event_attendance“ mit dem Alias ​​t1 versehen und mit einer Unterabfrage (mit dem Alias ​​t2) verknüpft, die den maximalen Zeitstempel für jedes Mitglied berechnet. Die JOIN-Bedingung gleicht Zeilen basierend auf der Mitglieds-ID und dem maximalen Zeitstempel ab und stellt so sicher, dass nur die letzte Anwesenheit jedes Mitglieds in den Ergebnissen enthalten ist.

Verwendung von benutzerdefinierter Aggregation und Teilzeichenfolge

Eine effizientere Lösung ist die Verwendung einer benutzerdefinierten Aggregation und Teilzeichenfolge anstelle von Unterabfragen:

SELECT id_branch_channel, id_member, 
    substring(max(concat(from_unixtime(timestamp), attendance)) from 20) as attendance
FROM view_event_attendance
WHERE id_event = 782
GROUP BY id_event, id_member;

Diese Abfrage kombiniert den Zeitstempel und die Anwesenheit in einer einzigen Zeichenfolge für jede Zeile und verwendet max(), um die auszuwählen Maximalwert innerhalb jeder Mitgliedergruppe. Die Funktion substring() extrahiert dann den Anwesenheitsteil der verketteten Zeichenfolge. Dieser Ansatz vermeidet den mit Unterabfragen verbundenen Leistungsaufwand.

Das obige ist der detaillierte Inhalt vonWie rufe ich den letzten Anwesenheitsdatensatz für jedes Mitglied in MySQL 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