sql >> Database teknologi >  >> RDS >> Mysql

Forespørger på samtaler fra meddelelsestabellen

Hvis jeg forstår dit krav korrekt, ønsker du at få den seneste beskeddato for hver samtale, der involverer en bestemt bruger. I dette tilfælde kan vi samle samtaler for en given bruger og beholde den seneste beskeddato.

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

Output:

Forklaring:

Udfordringen i denne forespørgsel er at finde en måde at gruppere samtaler mellem to brugere sammen. Jeg brugte LEAST/GREATEST trick, som er en måde, hvorpå vi kan behandle en 2 -> 4 og 4 -> 2 samtale som logisk set det samme. Brug derefter GROUP BY , kan vi identificere den seneste samtaledato for det par samtalende brugere. Så underforespørgslen i mit svar ovenfor finder, for hvert par brugere, uden hensyntagen til nogen rækkefølge, dette par sammen med dets seneste samtaledato. Vi føjer derefter dette resultat tilbage til messages tabel for at hente den faktiske seneste beskedtekst.

Demo her:

Rextester



  1. Det samlede antal låse overstiger låsebordets størrelse

  2. Fejl med MySQL CREATE TABLE-forespørgsel

  3. PHP, PDO, MySQL, Bemærk:Forsøger at få ejendom af ikke-objekt

  4. Hvordan implementerer man automatisk visningsopdatering, så snart der er ændring i databasen i AngularJs?