1

サイト上の 2 人のユーザー間で送信されたすべてのメッセージが格納される usermessages テーブルがあります。

各メッセージにはsourceUserIdと がありfriendId、これらは送信者と受信者です。

すべてのユーザー メッセージ受信ボックスには、送受信されたすべてのメッセージが一覧表示され、各メッセージには、そのメッセージを送受信したユーザーが表示されます。

問題

送信ユーザーと受信ユーザーをリストしているため、一部の列が間違っています。たとえば、現在のユーザーの userId が 1 の場合です。

  • 送信されたメッセージの sourceUserId は 1 になります
  • 受信したメッセージのfriendIdは1になります

1 つのクエリで受信トレイ全体を実行しようとすると、現在両方sourceUserIdで2 つの結合を実行する必要があり、どちらfriendIdが現在ログインしているユーザーであるかがわからないためです。

現在ログインしているユーザーのユーザー名を既に知っているので、必要なのが 1 つだけの場合に 2 つの参加を行うのは正しくないと思われますか?

mysqlクエリである種のケースを使用して、以下を効果的に達成し、毎回検索する必要があるデータの量を減らすことができるかどうか疑問に思っています..

SELECT um.message, UNIX_TIMESTAMP(um.time), um.read, user.username
FROM usermessages um
    CASE 
        WHEN um.friendId = 1
            INNER JOIN user ON um.sourceUserId = user.id
        WHEN um.sourceUserId = 1        
            INNER JOIN user ON um.friendId = user.id
    END
WHERE (um.friendId = 1 OR um.sourceUserId = 1)
4

2 に答える 2

2

CASE代わりにforON句を使用する必要があります

SELECT um.message, UNIX_TIMESTAMP(um.time), um.read, user.username
FROM usermessages um
INNER JOIN user ON 
    CASE 
        WHEN um.friendId = 1 THEN um.sourceUserId
                             ELSE um.friendId
    END = user.id
WHERE (um.friendId = 1 OR um.sourceUserId = 1)

(または、必要に応じて比較= user.idを内側に移動しCASEます)

于 2012-05-18T02:43:51.770 に答える
1

case whenを使用する代わりに、ブール値の方法で行う別のアプローチ:

SELECT um.message, UNIX_TIMESTAMP(um.time), um.read, user.username
FROM usermessages um
INNER JOIN user ON 
    (um.friendId = 1 AND um.sourceUserId = user.id)
    OR
    um.friendId = user.id
WHERE (um.friendId = 1 OR um.sourceUserId = 1)
于 2012-05-18T03:13:01.683 に答える