Myślę, że Twoje zapytanie daje „właściwe” wyniki, tak jakbyś chciał zobaczyć ostatnią wiadomość w niektórych rozmowach, powinieneś naprawdę pogrupować według conversation_id
. Jednak nie widzę tego pola w schemacie.
Jeśli zrobisz WHERE sender_id = 3 GROUP BY receiver_id
, to jest poprawne, że zapytanie zwraca wiadomości 1 i 7, ponieważ te wiadomości zostały wysłane do innych ludzi, dlatego w twoim projekcie są to różne rozmowy.
Jeśli chcesz ogólnie widzieć tylko ostatnią wiadomość wysłaną przez Ciebie, po prostu usuń GROUP BY
w drugiej części twojego UNION
. W przeciwnym razie rozważ przeprojektowanie schematu.
EDYTUJ:
Wypróbuj to zapytanie:
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)
);
Kilka uwag:
UNION
nie jest już potrzebny;- To podejście spowoduje, że wszystkie wiadomości e-mail między 2 stronami będą traktowane jako jedna rozmowa, co nie zawsze jest prawdą. Możesz chcieć przeprojektować to podejście;
- Zły styl jest używanie słów zastrzeżonych (takich jak
date
) dla nazw kolumn lub aliasów, staraj się tego unikać. Lub użyj backticków, jeśli ich używasz.