要件を正しく理解している場合は、特定のユーザーが関与するすべての会話の最新のメッセージ日付を取得する必要があります。この場合、特定のユーザーの会話を集約して、最新のメッセージ日付を保持できます。
SELECT m1.*
FROM messages m1
INNER JOIN
(
SELECT LEAST(sender_id, recipient_id) AS first,
GREATEST(sender_id, recipient_id) AS second,
MAX(created_at) AS recent_date
FROM messages
WHERE sender_id = 2 OR recipient_id = 2
GROUP BY LEAST(sender_id, recipient_id),
GREATEST(sender_id, recipient_id)
) m2
ON LEAST(m1.sender_id, m1.recipient_id) = m2.first AND
GREATEST(m1.sender_id, m1.recipient_id) = m2.second AND
m1.created_at = m2.recent_date
出力:
説明:
このクエリの課題は、2人のユーザー間の会話をグループ化する方法を見つけることです。 LEAST/GREATEST
を使用しました トリック。これは、2 -> 4
を処理する方法です。 および4 -> 2
論理的に同じものとしての会話。次に、GROUP BY
を使用します 、会話しているユーザーのそのペアの最新の会話日を特定できます。したがって、上記の私の回答のサブクエリは、ユーザーのペアごとに、順序に関係なく、そのペアと最新の会話日を検出します。次に、この結果をmessages
に結合します。 実際の最新のメッセージテキストを取り込むためのテーブル。
デモはこちら: