Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL:Вземете най-новото съобщение от 2 таблици, които са свързани една с друга

В по-стари версии на MySQL (<8.0.2) можем да използваме Извлечени таблици . В извлечена таблица можем да получим най-новия send_datetime стойност за всеки conversation_id . Също така, заслужава да се отбележи, че можете да предоставите своите филтри за идентификатор на разговор в КЪДЕ клауза на тази подзаявка.

След това можем да използваме набора от резултати на тази подзаявка и да се присъединим обратно към основните таблици по подходящ начин, за да получим реда, съответстващ на последното съобщение в разговор.

Схема (MySQL v5.7)

Преглед на DB Fiddle

Запитване №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)

Преглед на DB Fiddle

Запитване №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 | Последно съобщение |

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL низ замяна

  2. Намиране на минимума в колона, където две други колони са нула

  3. Намерете броя на колоните в таблица

  4. Как да получите броя на битовете в низ в MySQL – BIT_LENGTH()

  5. Случаи на използване на MySQL `FORCE INDEX`?