Jag tror att din fråga ger de "rätta" resultaten, som om du skulle vilja se det sista meddelandet i några av konversationerna borde du verkligen gruppera efter conversation_id
. Jag ser dock inte det här fältet du i schemat.
Om du gör WHERE sender_id = 3 GROUP BY receiver_id
, då är det korrekt, den frågan returnerar meddelandena 1 och 7, eftersom dessa meddelanden hade skickats till olika människor, så i din design är de olika konversationer.
Om du bara vill se det allra senaste meddelandet som du skickat i allmänhet, ta bara bort GROUP BY
i den andra delen av din UNION
. Annars kan du överväga att omforma ditt schema.
EDIT:
Testa den här frågan:
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)
);
Några anteckningar:
UNION
behövs inte längre;- Det här tillvägagångssättet kommer att behandla alla e-postmeddelanden mellan två parter som en enda konversation, vilket inte alltid är sant. Du kanske vill omforma detta tillvägagångssätt;
- Det är en dålig stil att använda reserverade ord (som
date
) för kolumners namn eller alias, försök att undvika detta. Eller använd backticks om du använder dem.