Jeg tror, din forespørgsel giver de "rigtige" resultater, som hvis du gerne vil se den sidste besked i nogle af samtalerne, bør du virkelig gruppere efter conversation_id
. Jeg kan dog ikke se dette felt dig i skemaet.
Hvis du gør WHERE sender_id = 3 GROUP BY receiver_id
, så er det korrekt, at forespørgslen returnerer dig besked 1 og 7, fordi disse beskeder var blevet sendt til andre mennesker, så i dit design er de forskellige samtaler.
Hvis du kun vil se den allersidste besked, der er sendt af dig generelt, skal du bare fjerne GROUP BY
i den anden del af din UNION
. Ellers kan du overveje at re-designe dit skema.
EDIT:
Prøv denne forespørgsel:
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)
);
Nogle bemærkninger:
UNION
er ikke længere nødvendig;- Denne tilgang vil behandle alle e-mails mellem 2 parter som en enkelt samtale, hvilket ikke altid er sandt. Du ønsker måske at omdesigne denne tilgang;
- Det er en dårlig stil at bruge reserverede ord (som
date
) for kolonnenavne eller aliasser, prøv at undgå dette. Eller brug backticks, hvis du bruger dem.