sql >> Databáze >  >> RDS >> Mysql

Dotazování konverzací z tabulky zpráv

Pokud správně rozumím vašemu požadavku, chcete získat nejnovější datum zprávy pro každou konverzaci s určitým uživatelem. V tomto případě můžeme agregovat konverzace pro daného uživatele a ponechat si nejnovější datum zprávy.

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

Výstup:

Vysvětlení:

Úkolem tohoto dotazu je najít způsob, jak seskupit konverzace mezi dvěma uživateli dohromady. Použil jsem LEAST/GREATEST trik, což je způsob, jak můžeme zacházet s 2 -> 4 a 4 -> 2 konverzaci jako logicky totéž. Poté pomocí GROUP BY , můžeme identifikovat poslední datum konverzace pro tuto dvojici konverzujících uživatelů. Takže dílčí dotaz v mé odpovědi výše najde pro každý pár uživatelů, bez ohledu na objednávku, tento pár spolu s posledním datem konverzace. Tento výsledek pak připojíme zpět ke messages tabulka pro zobrazení aktuálního textu poslední zprávy.

Ukázka zde:

Rextester



  1. Jaký je rozdíl mezi tinyint, smallint, mediumint, bigint a int v MySQL?

  2. Nahrání velkého souboru CSV do databáze Mysql

  3. Otázka výkonu:AKTUALIZACE DUPLIKÁTNÍHO KLÍČE vs UPDATE (MySQL)

  4. Při spuštění sonar-runer vyvolá výjimku:Způsobeno:Neznámý stav databáze:FRESH_INSTALL