4

ここに私の2つのテーブルがあります:

TABLE: friends

'id' // primary id, auto increment
'uid' // user id who sent friend request
'fid' // friend id who received friend request
'status' //status of friendship, 1=active

.

TABLE: messages

'id' // message id (primary id), auto increment
'uid' // user who sent the message
'fid' // friend who received the message
'time' // time when the message was sent
'status' // status of message, read or unread.

メッセージを送信した、またはメッセージを受信した友人のリストのみを、(友人または私が) 最後にメッセージを送信した時間順に並べて表示したいと考えています。1 人のフレンドは 1 回だけ登録する必要があります。どうすればいいですか?

4

1 に答える 1

4

メッセージを送信した、またはメッセージを受信した友人のリストのみを、最後に送信されたメッセージの時間(友人または私)で並べ替えて表示したいと思います。

これを試して:

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

SQLフィドルデモ

たとえば、これはあなたに与えるでしょう:

| 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。それでおしまい。

于 2012-12-09T12:53:22.783 に答える