それぞれの人が両方の位置にいるため、チャットごとに2つの回答が得られる可能性があります
ChatID Sender Receiver
1 1 2
2 2 1
3 1 2
4 2 1
So, you'll have a record grouped by
Sender / Receiver
1 2 and
2 1
あなたが探しているのは、会話の中で、彼らがいる位置に関係なく、上記を「ワンチャット」と見なすべき明確な人々だと思います。これを修正するには、次のようにします...
select
PreQuery.*,
m2.Message,
m2.SenderID,
m2.ReceiverID
from
( SELECT
if( m.senderID < m.receiverID, m.senderID, m.receiverID ) as Person1,
if( m.senderID < m.receiverID, m.receiverID, m.senderID ) as Person2,
max( m.ID ) as LastMessageIDPerChat,
max( m.AddedDate ) as LastMessageDate
FROM
messages m
WHERE
m.Source = "1"
AND "1" IN ( SenderID, ReceiverID )
GROUP BY
Person1,
Person2
ORDER BY
m.AddedDate DESC
LIMIT 10 ) PreQuery
JOIN Messages m2
on PreQuery.LastMessageIDPerChat = m2.ID
これにより、上記のように誤った重複を防ぐために、IDが低い方が常に最初の位置になり、IDが高い方が常に2番目の位置になります。
また、注意してください... GROUP BYは通常、すべての非group byフィールドが何らかの集計に関連付けられていることを期待しています。そうでない場合、修飾条件で見つかったレコードの最初のインスタンスを取得するだけです。したがって、同じ人を異なる日に会話に含めたい場合は、グループに「AddedDate」を追加して、次のようにすることができます...
Person1 Person2 on 4/20
Person1 Person3 on 4/20
Person3 Person4 on 4/20
Person1 Person2 on 4/18
Person1 Person5 on 4/17
Person3 Person4 on 4/15
最後に送信した人のステータスを取得するには、会話ごとにペアの人のクエリをラップし、その会話の最後のIDを取得する必要がありました。次に、それを取得して、そのIDのメッセージに再度参加します(IDが実際にメッセージテーブルの主キーIDである場合は、必要に応じて調整します)。参加から、会話の最後のメッセージと、そのトランザクションの送信者IDと受信者ID(および現在のエイリアス「m2」参照から必要なその他のデータ)を取得できます。