Acho que sua consulta está produzindo os resultados “certos”, como se você quisesse ver a última mensagem em algumas das conversas, você deveria agrupar pelo
conversation_id
. Eu não vejo este campo você no esquema embora. Se você fizer
WHERE sender_id = 3 GROUP BY receiver_id
, então está correto, essa consulta retorna as mensagens 1 e 7, porque essas mensagens foram enviadas para diferentes pessoas, portanto no seu design são conversas diferentes. Se você quiser ver apenas a última mensagem enviada por você em geral, basta remover
GROUP BY
na segunda parte do seu UNION
. Caso contrário, considere reprojetar seu esquema. EDITAR:
Tente esta consulta:
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)
);
Algumas notas:
UNION
não é mais necessário;- Essa abordagem tratará todos os e-mails entre duas partes como uma única conversa, o que nem sempre é verdade. Você pode querer redesenhar essa abordagem;
- É um estilo ruim usar palavras reservadas (como
date
) para nomes ou aliases de colunas, tente evitar isso. Ou use acentos graves se você os usar.