В по-стари версии на MySQL (<8.0.2) можем да използваме Извлечени таблици
. В извлечена таблица можем да получим най-новия send_datetime
стойност за всеки conversation_id
. Също така, заслужава да се отбележи, че можете да предоставите своите филтри за идентификатор на разговор в КЪДЕ
клауза на тази подзаявка.
След това можем да използваме набора от резултати на тази подзаявка и да се присъединим обратно към основните таблици по подходящ начин, за да получим реда, съответстващ на последното съобщение в разговор.
Схема (MySQL v5.7)
Запитване №1
ИЗБЕРЕТЕ amc.conversation_id, m.message_id, m.message ОТ assoc_message__conversation КАТО amcJOIN съобщение AS m ON m.message_id =amc.message_id ПРИСЪЕДИНЕТЕ ( SELECT amc1.conversation_id, MAXda(m1.ste)ste ASoc_time_send_caster_message_send КАТО amc1 JOIN съобщение КАТО m1 ON m1.message_id =amc1.message_id КЪДЕ amc1.conversation_id IN (1,2) -- Тук предоставяте вашите входни филтри GROUP BY amc1.conversation_id) КАТО dt ON dt.conversation_id =amc.conversation_id И dt .latest_send_datetime =m.send_datetime;
Резултат
<предварителен код>| идентификатор на разговор | идентификатор_съобщение | съобщение || --------------- | ---------- | -------------- || 1 | 3 | Последно съобщение || 2 | 6 | Последно съобщение |
В MySQL 8.0.2 и по-нови, можем да използваме Row_Number()
функционалност. В рамките на дял на conversation_id
, ще определим номера на ред за всяко съобщение, сортирано в низходящ ред на send_datetime
. В тази подзаявка можете да предоставите своите филтри за идентификатор на разговор в КЪДЕ
клауза.
След това ще използваме този набор от резултати като извлечена таблица и ще разгледаме само онези редове, където стойността на номера на ред е 1 (тъй като ще принадлежи на последния send_datetime
).
Схема (MySQL v8.0)
Запитване №2
ИЗБЕРЕТЕ dt.conversation_id, dt.message_id, dt.message FROM ( SELECT amc.conversation_id, m.message_id, m.message, ROW_NUMBER() НАД (PARTITION BY amc.conversation_id ORDER BY m.send_datetime) КАТО row_no FROM assoc_message__conversation КАТО amc JOIN съобщение AS m ON m.message_id =amc.message_id WHERE amc.conversation_id IN (1,2) -- Тук предоставяте вашите входни филтри) AS dt WHERE dt.row_no =1;
Резултат
<предварителен код>| идентификатор на разговор | идентификатор_съобщение | съобщение || --------------- | ---------- | -------------- || 1 | 3 | Последно съобщение || 2 | 6 | Последно съобщение |