メッセージを送信した、またはメッセージを受信した友人のリストのみを、最後に送信されたメッセージの時間(友人または私)で並べ替えて表示したいと思います。
これを試して:
SELECT DISTINCT friends.id
FROM messages m
INNER JOIN
(
SELECT uid id FROM friends WHERE status = 1 AND fid = myuserid
UNION ALL
SELECT fid FROM friends WHERE status = 1 AND uid = myuserid
) friends ON m.fid = friends.id OR m.uid = friends.id
ただし、users
テーブルがある場合は、次のように実行できます。
SELECT
senders.name 'From',
recievers.name 'To',
m.id,
m.body,
m.messagetime,
m.status
FROM messages m
INNER JOIN
(
SELECT uid id FROM friends WHERE status = 1 AND fid = 1
UNION ALL
SELECT fid FROM friends WHERE status = 1 AND uid = 1
) friends ON m.fid = friends.id OR m.uid = friends.id
INNER JOIN users senders ON m.uid = senders.id
INNER JOIN users recievers ON m.fid = recievers.id
WHERE m.uid = 1
OR m.fid = 1
ORDER BY m.messagetime ASC OR DESC
たとえば、これはあなたに与えるでしょう:
| FROM | TO | ID | BODY | MESSAGETIME | STATUS |
--------------------------------------------------
| Me | B | 1 | hiiii | 2012-12-01 | 1 |
| c | Me | 7 | sadfds | 2012-12-01 | 1 |
| Me | B | 8 | ddd | 2012-12-10 | 1 |
このクエリはどのように機能しますか?
クエリ:
SELECT uid id FROM friends WHERE status = 1 AND fid = myuserid
UNION ALL
SELECT fid FROM friends WHERE status = 1 AND uid = myuserid
あなたの友達のリストが表示されます。あなたの友達は次のいずれかです。
- ユーザーが友情リクエストを送信して承認した、または
- あなたが彼に友情リクエストを送信し、彼がそれを受け入れるユーザー。
そのため、私はあなたのユーザーIDでを使用しUNION ALL
ましfid =
たstatus = 1
。これは、友情のリクエストが受け入れられることも意味すると思いました。
これらはあなたの友達です。次に、メッセージを送信または受信した友達のリストを取得するには、この結果セットをmessages
テーブルに結合する必要があります。ただし、送信されたメッセージまたは送信されたメッセージを取得するには、参加条件を選択する必要がありますm.fid = friends.id OR m.uid = friends.id
。それでおしまい。