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?
Denk ook eens aan de verbeterde en vereenvoudigde testcase.