In älteren MySQL-Versionen (<8.0.2) können wir Abgeleitete Tabellen
. In einer abgeleiteten Tabelle können wir die neueste send_datetime
erhalten Wert für jede conversation_id
. Bemerkenswert ist auch, dass Sie Ihre Filter für conversation_id im WHERE
angeben können -Klausel dieser Unterabfrage.
Wir können dann die Ergebnismenge dieser Unterabfrage verwenden und entsprechend mit den Haupttabellen zurückverknüpfen, um die Zeile zu erhalten, die der letzten Nachricht in einer Konversation entspricht.
Schema (MySQL v5.7)
Abfrage 1
SELECT
amc.conversation_id,
m.message_id,
m.message
FROM
assoc_message__conversation AS amc
JOIN message AS m
ON m.message_id = amc.message_id
JOIN
(
SELECT
amc1.conversation_id,
MAX(m1.send_datetime) AS latest_send_datetime
FROM
assoc_message__conversation AS amc1
JOIN message AS m1
ON m1.message_id = amc1.message_id
WHERE amc1.conversation_id IN (1,2) -- Here you provide your input filters
GROUP BY amc1.conversation_id
) AS dt
ON dt.conversation_id = amc.conversation_id AND
dt.latest_send_datetime = m.send_datetime;
Ergebnis
| conversation_id | message_id | message |
| --------------- | ---------- | -------------- |
| 1 | 3 | Latest message |
| 2 | 6 | Latest message |
In MySQL 8.0.2 und höher können wir Row_Number()
verwenden Funktionalität. Innerhalb einer Partition von conversation_id
, bestimmen wir die Zeilennummer für jede Nachricht, sortiert in absteigender Reihenfolge von send_datetime
. In dieser Unterabfrage können Sie Ihre Filter für "conversation_id" im WHERE
angeben Klausel.
Wir werden diese Ergebnismenge dann als abgeleitete Tabelle verwenden und nur die Zeilen berücksichtigen, bei denen der Wert der Zeilennummer 1 ist (da er zum letzten send_datetime
gehört ).
Schema (MySQL v8.0)
Abfrage 2
SELECT
dt.conversation_id,
dt.message_id,
dt.message
FROM
(
SELECT
amc.conversation_id,
m.message_id,
m.message,
ROW_NUMBER() OVER (PARTITION BY amc.conversation_id
ORDER BY m.send_datetime DESC) AS row_no
FROM
assoc_message__conversation AS amc
JOIN message AS m
ON m.message_id = amc.message_id
WHERE amc.conversation_id IN (1,2) -- Here you provide your input filters
) AS dt
WHERE dt.row_no = 1;
Ergebnis
| conversation_id | message_id | message |
| --------------- | ---------- | -------------- |
| 1 | 3 | Latest message |
| 2 | 6 | Latest message |