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!