いくつかの会話の最後のメッセージを見たいかのように、クエリは「正しい」結果を生成していると思います。実際には、conversation_id
でグループ化する必要があります。 。ただし、このフィールドはスキーマには表示されません。
WHERE sender_id = 3 GROUP BY receiver_id
を実行する場合 、それなら正しいです、そのクエリはあなたにメッセージ1と7を返します、'それらのメッセージは異なるに送信されました 人々、したがってあなたのデザインでは、彼らは異なる会話です。
一般的に送信された最後のメッセージのみを表示したい場合は、GROUP BY
を削除してください。 UNION
の2番目の部分 。それ以外の場合は、スキーマの再設計を検討してください。
編集:
このクエリを試してください:
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
もう必要ありません; - このアプローチでは、2者間のすべての電子メールが単一の会話として扱われますが、これは常に正しいとは限りません。このアプローチを再設計することをお勧めします;
- 予約語(
date
など)を使用するのは悪いスタイルです )列の名前またはエイリアスについては、これを避けてください。または、バックティックを使用する場合はバックティックを使用します。