Nelle versioni precedenti di MySQL (<8.0.2), possiamo utilizzare Tabelle derivate
. In una tabella derivata, possiamo ottenere l'ultimo send_datetime
valore per ogni conversation_id
. Inoltre, è interessante notare che puoi fornire i tuoi filtri per conversation_id in WHERE
clausola di questa sottoquery.
Possiamo quindi utilizzare il set di risultati di questa sottoquery e tornare alle tabelle principali in modo appropriato, per ottenere la riga corrispondente all'ultimo messaggio in una conversazione.
Schema (MySQL v5.7)
Richiesta n. 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;
Risultato
| conversation_id | message_id | message |
| --------------- | ---------- | -------------- |
| 1 | 3 | Latest message |
| 2 | 6 | Latest message |
In MySQL 8.0.2 e versioni successive, possiamo usare Row_Number()
funzionalità. All'interno di una partizione di conversation_id
, determineremo il numero di riga per ogni messaggio, ordinato in ordine decrescente di send_datetime
. In questa sottoquery, puoi fornire i tuoi filtri per conversation_id in WHERE
clausola.
Utilizzeremo quindi questo set di risultati come tabella derivata e considereremo solo quelle righe in cui il valore del numero di riga è 1 (poiché apparterrà all'ultimo send_datetime
).
Schema (MySQL v8.0)
Richiesta n. 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;
Risultato
| conversation_id | message_id | message |
| --------------- | ---------- | -------------- |
| 1 | 3 | Latest message |
| 2 | 6 | Latest message |