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

Запитване на разговори от таблицата със съобщения

Ако разбирам правилно вашето изискване, искате да получите най-новата дата на съобщение за всеки разговор, включващ определен потребител. В този случай можем да обобщим разговорите за даден потребител и да запазим най-новата дата на съобщението.

SELECT m1.*
FROM messages m1
INNER JOIN
(
    SELECT LEAST(sender_id, recipient_id)    AS first,
           GREATEST(sender_id, recipient_id) AS second,
           MAX(created_at) AS recent_date
    FROM messages
    WHERE sender_id = 2 OR recipient_id = 2
    GROUP BY LEAST(sender_id, recipient_id),
             GREATEST(sender_id, recipient_id)
) m2
    ON LEAST(m1.sender_id, m1.recipient_id)    = m2.first AND
       GREATEST(m1.sender_id, m1.recipient_id) = m2.second AND
       m1.created_at = m2.recent_date

Изход:

Обяснение:

Предизвикателството в тази заявка е да се намери начин за групиране на разговори между двама потребители заедно. Използвах LEAST/GREATEST трик, който е начин, по който можем да третираме 2 -> 4 и 4 -> 2 разговор като логически едно и също нещо. След това с помощта на GROUP BY , можем да идентифицираме най-новата дата на разговор за тази двойка разговарящи потребители. Така че подзаявката в моя отговор по-горе намира, за всяка двойка потребители, без да се съобразява с какъвто и да е ред, тази двойка заедно с нейната най-нова дата на разговор. След това присъединяваме този резултат обратно към messages таблица, за да въведете действителния текст на последното съобщение.

Демо тук:

Rextester



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да наложите char(N) тип данни вместо varchar(N) в полето на модела на django

  2. Изпълнете mysql insert само ако таблицата е празна

  3. Актуализирайте множество редове с известни ключове, без да вмъквате нови редове, ако бъдат открити несъществуващи ключове

  4. python mysqldb err на моя Mac :Библиотеката не е заредена:@rpath/libmysqlclient.21.dylib

  5. MySQL многоколонен първичен ключ