Ich denke, Ihre Abfrage liefert die „richtigen“ Ergebnisse, denn wenn Sie die letzte Nachricht in einigen der Konversationen sehen möchten, sollten Sie wirklich nach der conversation_id
gruppieren . Ich sehe dieses Feld aber nicht im Schema.
Wenn Sie WHERE sender_id = 3 GROUP BY receiver_id
tun , dann ist es richtig, dass diese Abfrage Ihnen die Nachrichten 1 und 7 zurückgibt, da diese Nachrichten an anders gesendet wurden Personen, daher sind sie in Ihrem Design unterschiedliche Konversationen.
Wenn Sie generell nur die allerletzte von Ihnen gesendete Nachricht sehen möchten, entfernen Sie einfach GROUP BY
im zweiten Teil Ihrer UNION
. Ziehen Sie andernfalls in Betracht, Ihr Schema neu zu gestalten.
BEARBEITEN:
Probieren Sie diese Abfrage aus:
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)
);
Einige Anmerkungen:
UNION
wird nicht mehr benötigt;- Bei diesem Ansatz werden alle E-Mails zwischen zwei Parteien als eine einzige Konversation behandelt, was nicht immer der Fall ist. Vielleicht möchten Sie diesen Ansatz neu gestalten;
- Es ist ein schlechter Stil, reservierte Wörter zu verwenden (wie
date
) für Spaltennamen oder Aliase, versuchen Sie dies zu vermeiden. Oder verwenden Sie Backticks, wenn Sie sie verwenden.