Penso che la tua query stia producendo i risultati "giusti", come se volessi vedere l'ultimo messaggio in alcune conversazioni, dovresti davvero raggruppare per conversation_id
. Tuttavia, non vedo questo campo nello schema.
Se fai WHERE sender_id = 3 GROUP BY receiver_id
, allora è corretto, quella query ti restituisce i messaggi 1 e 7, perché quei messaggi erano stati inviati a diversi persone, quindi nel tuo design sono conversazioni diverse.
Se vuoi vedere solo l'ultimo messaggio inviato da te in generale, rimuovi semplicemente GROUP BY
nella seconda parte del tuo UNION
. In caso contrario, valuta la possibilità di riprogettare il tuo schema.
MODIFICA:
Prova questa query:
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)
);
Alcune note:
UNION
non è più necessario;- Questo approccio tratterà tutte le e-mail tra 2 parti come un'unica conversazione, il che non è sempre vero. Potresti voler riprogettare questo approccio;
- È un cattivo stile usare parole riservate (come
date
) per i nomi o gli alias delle colonne, cerca di evitarlo. Oppure usa i backtick se li usi.