Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Odpytywanie wątków z tabeli wiadomości

Jeśli dobrze rozumiem Twoje wymagania, chcesz uzyskać najnowszą datę wiadomości dla każdej rozmowy z określonym użytkownikiem. W takim przypadku możemy agregować konwersacje dla danego użytkownika i zachować najnowszą datę wiadomości.

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

Wyjście:

Wyjaśnienie:

Wyzwaniem w tym zapytaniu jest znalezienie sposobu na grupowanie rozmów między dwoma użytkownikami razem. Użyłem LEAST/GREATEST trik, czyli sposób, w jaki możemy potraktować 2 -> 4 i 4 -> 2 rozmowa jest logicznie tym samym. Następnie, używając GROUP BY , możemy określić datę ostatniej rozmowy dla tej pary konwersujących użytkowników. Tak więc podzapytanie w mojej odpowiedzi powyżej znajduje dla każdej pary użytkowników, bez względu na kolejność, tę parę wraz z datą ostatniej rozmowy. Następnie dołączamy ten wynik z powrotem do messages tabela, aby wprowadzić aktualny tekst ostatniej wiadomości.

Demo tutaj:

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. MySQL Update pierwsze wystąpienie rekordu

  2. Korzystanie z przygotowanych instrukcji za pomocą mysql w pythonie

  3. Python skopiuj tabelę MySQL do SQLite3

  4. Grupuj wiersze za pomocą grupowania według klauzuli w MySQL

  5. Apostrofy i dwukropki w ładnych linkach