Myslím, že váš dotaz přináší „správné“ výsledky, protože pokud byste chtěli vidět poslední zprávu v některých konverzacích, měli byste seskupit podle conversation_id
. Toto pole vás však ve schématu nevidím.
Pokud uděláte WHERE sender_id = 3 GROUP BY receiver_id
, pak je správně, že vám tento dotaz vrátí zprávy 1 a 7, protože tyto zprávy byly odeslány jiným lidé, takže ve vašem návrhu jsou to různé konverzace.
Pokud chcete vidět pouze úplně poslední vámi odeslanou zprávu, stačí odstranit GROUP BY
ve druhé části vašeho UNION
. V opačném případě zvažte přepracování schématu.
UPRAVIT:
Zkuste tento dotaz:
SELECT m.message_id, u.username, m.subject, m.message,
m.status, UNIX_TIMESTAMP(m.date) as `date`
FROM users u
LEFT JOIN messages m ON m.sender_id = u.id
WHERE m.message_id IN (
SELECT max(message_id)
FROM messages
WHERE receiver_id = 3 OR sender_id = 3
GROUP BY least(sender_id,receiver_id),
greatest(sender_id,receiver_id)
);
Několik poznámek:
UNION
již není potřeba;- Tento přístup bude považovat všechny e-maily mezi 2 stranami za jednu konverzaci, což není vždy pravda. Možná budete chtít tento přístup přepracovat;
- Použít vyhrazená slova (jako
date
) je špatný styl ) pro názvy nebo aliasy sloupců se tomu snažte vyhnout. Nebo použijte backticks, pokud je používáte.