sql >> Databasteknik >  >> RDS >> Mysql

Frågar konversationer från meddelandetabellen

Om jag förstår ditt krav korrekt vill du få det senaste meddelandedatumet för varje konversation som involverar en viss användare. I det här fallet kan vi sammanställa konversationer för en viss användare och behålla det senaste meddelandedatumet.

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

Utdata:

Förklaring:

Utmaningen i den här frågan är att hitta ett sätt att gruppera konversationer mellan två användare tillsammans. Jag använde LEAST/GREATEST trick, vilket är ett sätt som vi kan behandla en 2 -> 4 och 4 -> 2 konversation som logiskt sett är samma sak. Använd sedan GROUP BY , kan vi identifiera det senaste konversationsdatumet för det paret av konverserande användare. Så underfrågan i mitt svar ovan hittar, för varje par användare, utan hänsyn till någon ordning, det paret tillsammans med dess senaste konversationsdatum. Vi sammanfogar sedan detta resultat tillbaka till messages tabell för att få in den senaste meddelandetexten.

Demo här:

Rextester



  1. Ändra eller ställ in MySQL Long Query Time Value för log-slow-queries

  2. MySQL välj en kolumn DISTINCT, med motsvarande andra kolumner

  3. MySQL 5.5.9 och Hibernate-tabellskapningsfel på TYPE

  4. Excel VBA:skriva till mysql-databas