Za předpokladu uživatelů s ID 1
a 3
, stejně jako vy na housle, nás zajímá zpráva s nejnovějším created_at
a (sender_id, receiver_id)
je (1,3)
nebo (3,1)
.
Pro zkrácení syntaxe můžete použít ad-hoc typy řádků:
SELECT *
FROM messages
WHERE (sender_id, receiver_id) IN ((1,3), (3,1))
ORDER BY created_at DESC
LIMIT 1;
Nebo explicitně (a o něco rychleji, také snadněji použitelný s indexy):
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;
Pro všechny konverzace uživatele
Přidáno řešení podle požadavku v komentáři.
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;
Zde je přístup složen cizího odesílatele/příjemce do jednoho sloupce, aby se zjednodušila extrakce posledního řádku.
Podrobné vysvětlení pro DISTINCT ON
v této související odpovědi:
Vybrat první řádek v každé skupině GROUP BY?
Zvažte také vylepšený a zjednodušený testovací případ v houslích.