Мисля, че вашата заявка дава „правилните“ резултати, като че ако искате да видите последното съобщение в някои от разговорите, наистина трябва да групирате по conversation_id
. Все пак не виждам това поле в схемата.
Ако направите WHERE sender_id = 3 GROUP BY receiver_id
, тогава е правилно, че заявката ви връща съобщения 1 и 7, защото тези съобщения са били изпратени до различни хора, така че във вашия дизайн те са различни разговори.
Ако искате да видите само последното изпратено от вас съобщение като цяло, просто премахнете GROUP BY
във втората част на вашия UNION
. В противен случай помислете за препроектиране на вашата схема.
РЕДАКТИРАНЕ:
Опитайте тази заявка:
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)
);
Някои бележки:
UNION
вече не е необходимо;- Този подход ще третира всички имейли между две страни като един разговор, което не винаги е вярно. Може да искате да преработите този подход;
- Лош е стилът да се използват запазени думи (като
date
). ) за имена на колони или псевдоними, опитайте се да избегнете това. Или използвайте обратни отметки, ако ги използвате.