sql >> Database >  >> RDS >> PostgreSQL

Hoe krijg ik het laatste bericht in elk gesprek van een bepaalde gebruiker in SQL?

Uitgaande van de gebruikers met ID 1 en 3 , zoals je deed in de viool, zijn we geïnteresseerd in het bericht met de nieuwste created_at en (sender_id, receiver_id) zijnde (1,3) of (3,1) .

U kunt ad-hoc rijtypen gebruiken om de syntaxis kort te maken:

SELECT * 
FROM   messages 
WHERE  (sender_id, receiver_id) IN ((1,3), (3,1))
ORDER  BY created_at DESC
LIMIT  1;

Of expliciet (en iets sneller, ook makkelijker te gebruiken met indexen):

SELECT * 
FROM   messages 
WHERE (sender_id = 1 AND receiver_id = 3 OR
       sender_id = 3 AND receiver_id = 1)
ORDER  BY created_at DESC
LIMIT  1;

Voor allen conversaties van een gebruiker

Oplossing toegevoegd volgens verzoek in opmerking.

SELECT DISTINCT ON (user_id) *
FROM (
   SELECT 'out' AS type, id, receiver_id AS user_id, body, created_at
   FROM   messages 
   WHERE  sender_id = 1

   UNION  ALL
   SELECT 'in' AS type, id, sender_id AS user_id, body, created_at
   FROM   messages 
   WHERE  receiver_id = 1
   ) sub
ORDER  BY user_id, created_at DESC;

De benadering hier is om de buitenlandse afzender/ontvanger in één kolom te vouwen om het extraheren van de laatste rij te vereenvoudigen.

Gedetailleerde uitleg voor DISTINCT ON in dit gerelateerde antwoord:
Selecteer de eerste rij in elke GROUP BY-groep?

-> Bijgewerkt SQLfiddle .

Denk ook eens aan de verbeterde en vereenvoudigde testcase.



  1. Fout bij het maken van MySQL 5.5.9 en hibernate-tabel op TYPE

  2. Checkbox aangevinkt met PHP-formulierpost?

  3. twee procedures uitvoeren met één gebeurtenis

  4. Matchen met een groep die al dan niet bestaat