sql >> Database >  >> RDS >> Mysql

Opvragen van gesprekken vanuit de berichtentabel

Als ik uw eis goed begrijp, wilt u de meest recente berichtdatum voor elk gesprek met een bepaalde gebruiker. In dit geval kunnen we conversaties voor een bepaalde gebruiker samenvoegen en de meest recente berichtdatum behouden.

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

Uitvoer:

Uitleg:

De uitdaging in deze query is om een ​​manier te vinden om gesprekken tussen twee gebruikers samen te groeperen. Ik gebruikte de LEAST/GREATEST truc, dat is een manier waarop we een 2 -> 4 . kunnen behandelen en 4 -> 2 gesprek als logisch hetzelfde. Gebruik vervolgens GROUP BY , kunnen we de meest recente gespreksdatum voor dat paar converserende gebruikers identificeren. Dus de subquery in mijn antwoord hierboven vindt voor elk paar gebruikers, ongeacht de volgorde, dat paar samen met de meest recente gespreksdatum. We voegen dit resultaat vervolgens weer toe aan de messages tabel om de actuele tekst van het laatste bericht in te voeren.

Demo hier:

Rextester



  1. Hoe de datum en tijd op te maken in MySQL

  2. Star Trek 3D-schaakgegevensmodel

  3. LAST_INSERT_ID() is ongelijk aan $db->insert_id?

  4. Het volgnummer van een database-e-mailaccount binnen een profiel in SQL Server (T-SQL) wijzigen