Forudsat brugerne med ID 1
og 3
, ligesom du gjorde i violinen, er vi interesserede i beskeden med den seneste created_at
og (sender_id, receiver_id)
er (1,3)
eller (3,1)
.
Du kan bruge ad-hoc rækketyper til at gøre syntaksen kort:
SELECT *
FROM messages
WHERE (sender_id, receiver_id) IN ((1,3), (3,1))
ORDER BY created_at DESC
LIMIT 1;
Eller eksplicit (og lidt hurtigere, også nemmere at bruge med indekser):
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;
For alle en brugers samtaler
Tilføjet løsning efter anmodning i kommentar.
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;
Fremgangsmåden her er at folde udenlandsk afsender/modtager i én kolonne for at forenkle udtrækningen af den sidste række.
Detaljeret forklaring på DISTINCT ON
i dette relaterede svar:
Vælg første række i hver GROUP BY-gruppe?
Overvej også den forbedrede og forenklede testcase i violinen.