I ældre versioner af MySQL (<8.0.2) kan vi bruge Afledte tabeller
. I en afledt tabel kan vi få den seneste send_datetime
værdi for hver conversation_id
. Det er også bemærkelsesværdigt, at du kan angive dine filtre for conversation_id i WHERE
klausul i denne underforespørgsel.
Vi kan derefter bruge denne underforespørgsels resultatsæt og slutte os tilbage til hovedtabellerne på passende vis for at få den række, der svarer til den seneste besked i en samtale.
Skema (MySQL v5.7)
Forespørgsel #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;
Resultat
| conversation_id | message_id | message |
| --------------- | ---------- | -------------- |
| 1 | 3 | Latest message |
| 2 | 6 | Latest message |
I MySQL 8.0.2 og nyere kan vi bruge Row_Number()
funktionalitet. Indenfor en partition af conversation_id
, vil vi bestemme rækkenummeret for hver besked, sorteret i faldende rækkefølge send_datetime
. I denne underforespørgsel kan du angive dine filtre for conversation_id i WHERE
klausul.
Vi vil derefter bruge dette resultatsæt som en afledt tabel og kun overveje de rækker, hvor rækkenummerværdien er 1 (da den vil tilhøre seneste send_datetime
).
Skema (MySQL v8.0)
Forespørgsel #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;
Resultat
| conversation_id | message_id | message |
| --------------- | ---------- | -------------- |
| 1 | 3 | Latest message |
| 2 | 6 | Latest message |