私はテーブルを持っています:messages
この構造で:
`ID` // auto increment
`SenderUserID` // foreign key: `ID` from `User` table
`ReceiverUserID` // foreign key: `ID` from `User` table
`Message`
`DateCreated` // timestamp
次の条件で、テーブルから個別のReceiverUserIDを取得する必要があります。
- 送信者ユーザーは、受信者ユーザーと会話する必要があります。
- 選択した個別のメッセージ
ReceiverUserID
が最後のDateCreated
メッセージになります。
そのため、結果では、ユーザーの最後の会話を作成日DESCの順に並べます。
selectクエリで区別すると、mysqlは最初のレコードを返しますがDateCreated
、結果の上に最後のメッセージを取得するには、選択された`ReceiverUserIDに最大値が必要です。
SELECT DISTINCT `m`.`ReceiverUserID` AS `ID` FROM `messages` `m`
WHERE (`m`.`SenderUserID` = :UserID OR `m`.`ReceiverUserID` = :UserID)
ORDER BY `m`.`DateCreated` DESC
//:UserID means LogedInUserID
知っておくと良いですFacebookのメッセージボードとまったく同じになります。
ID, SenderUserID, ReceiverUserID, Message, DateCreated
1, 12, 11, 'Hi admin', 2012-10-24 11:07:00
2, 11, 12, 'Hi guy', 2012-10-24 11:08:00
3, 11, 13, 'Hello dear customer', 2012-10-24 11:12:00
4, 11, 13, 'Are you there?', 2012-10-24 11:13:00
5, 13, 11, 'Hiiii', 2012-10-24 11:14:00 // last conversation betwen 11 & 13
現在ログインしているユーザーID:11
SELECT `m`.`ReceiverUserID` AS `ID`, MAX(`m`.`DateCreated`) as `lastmsg`
FROM `messages` `m` WHERE (`m`.`SenderUserID` = 11 OR `m`.`ReceiverUserID` = 11)
GROUP BY `m`.`ReceiverUserID`
このセクションに問題があります。受信者ユーザーが送信者メッセージに応答したとき、11から13の間の最後の会話は返されません。結果には表示されません。
結果:
ID, lastmsg
12, 2012-10-24 11:08:00
13, 2012-10-24 11:13:00 // Should be: 13, 2012-10-24 11:14:00