In oudere versies van MySQL (<8.0.2) kunnen we Afgeleide tabellen
. In een afgeleide tabel kunnen we de laatste send_datetime
. krijgen waarde voor elke conversation_id
. Het is ook opmerkelijk dat u uw filters voor conversation_id kunt opgeven in de WHERE
clausule van deze subquery.
We kunnen dan de resultatenset van deze subquery gebruiken en op de juiste manier teruggaan naar de hoofdtabellen om de rij te krijgen die overeenkomt met het laatste bericht in een gesprek.
Schema (MySQL v5.7)
Vraag #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;
Resultaat
| conversation_id | message_id | message |
| --------------- | ---------- | -------------- |
| 1 | 3 | Latest message |
| 2 | 6 | Latest message |
In MySQL 8.0.2 en hoger kunnen we Row_Number()
gebruiken functionaliteit. Binnen een partitie van conversation_id
, zullen we het rijnummer voor elk bericht bepalen, gesorteerd in aflopende volgorde van send_datetime
. In deze subquery kunt u uw filters voor conversation_id opgeven in de WHERE
clausule.
We zullen deze resultaatset dan gebruiken als een afgeleide tabel, en alleen die rijen beschouwen, waar de rijnummerwaarde 1 is (omdat deze zal behoren tot de laatste send_datetime
).
Schema (MySQL v8.0)
Vraag #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;
Resultaat
| conversation_id | message_id | message |
| --------------- | ---------- | -------------- |
| 1 | 3 | Latest message |
| 2 | 6 | Latest message |