Je pense que votre requête produit les "bons" résultats, comme si vous vouliez voir le dernier message dans certaines conversations, vous devriez vraiment grouper par le conversation_id
. Je ne vois pas ce champ dans le schéma cependant.
Si vous faites WHERE sender_id = 3 GROUP BY receiver_id
, alors c'est correct, cette requête vous renvoie les messages 1 et 7, car ces messages ont été envoyés à différents les gens, donc dans votre conception, ce sont des conversations différentes.
Si vous voulez voir uniquement le tout dernier message envoyé par vous en général, supprimez simplement GROUP BY
dans la deuxième partie de votre UNION
. Sinon, envisagez de reconcevoir votre schéma.
MODIF :
Essayez cette requête :
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)
);
Quelques remarques :
UNION
n'est plus nécessaire ;- Cette approche traitera tous les e-mails entre 2 parties comme une seule conversation, ce qui n'est pas toujours vrai. Vous voudrez peut-être repenser cette approche ;
- C'est un mauvais style d'utiliser des mots réservés (comme
date
) pour les noms ou les alias des colonnes, essayez d'éviter cela. Ou utilisez des backticks si vous les utilisez.