0

このMySQLステートメントを実行するための最良の方法を見つけるのに苦労しています。

最初のテーブル「friends」には、userID、friendID、およびstatusがあります

2番目のテーブル'users'には、firstName、lastName、userIDがあります

3番目のテーブル'users_temp'にはtempUserID、tempUserNameがあります

1つのクエリでuserIDまたはfriendID=1の「friends」からすべてをプルして他のフィールド(userID = 1の場合はfriendIDを取得するか、friendID = 1の場合はuserIDを取得する)を「users」/「users_temp」に結合することを検討しています。ここで、そのuserID = users.userIDであり、存在する場合はusers_tempに参加します。

今私はこれを持っていますが、それは間違った結果を返し続けます。また、返されるuserIDは一意である必要があるため、ユーザーごとに1つだけ返します(これはフレンドリストであるため)

SELECT users.userid, 
       users.fbid              AS fbID, 
       users.firstname         AS firstName, 
       users.lastname          AS lastName, 
       users.phonenumber       AS phoneNumber, 
       users.avatar            AS avatar, 
       users_temp.tempusername AS tempUserName, 
       status, 
       friendid 
FROM   users 
       JOIN (SELECT friendid, 
                    userid, 
                    status 
             FROM   friends 
             WHERE  friendid = $userid 
                    AND ( ( status != 2 ) 
                          AND ( status != 3 ) ) 
             UNION ALL 
             SELECT friendid, 
                    userid, 
                    status 
             FROM   friends 
             WHERE  userid = $userid 
                    AND ( ( status != 2 ) 
                          AND ( status != 3 ) )) foo 
         ON users.userid = foo.userid 
       LEFT JOIN users_temp 
              ON users.userid = users_temp.tempuserid 

私はsqlfiddleを作成しましたが、これが私のsqlセットアップをさらに説明することを願っています

http://sqlfiddle.com/#!2/690c3/4

どんな助けでも大歓迎です!

ありがとう、

ウェス

4

1 に答える 1

0

私の知る限り、問題は、unionallクエリの2番目の部分で間違ったフィールドを使用して結合を行っていることである可能性があります

以下をお試しください

SELECT users.userid, 
  users.fbid              AS fbID, 
  users.firstname         AS firstName, 
  users.lastname          AS lastName, 
  users.phonenumber       AS phoneNumber, 
  users.avatar            AS avatar, 
  users_temp.tempusername AS tempUserName, 
  status
FROM   users 
   JOIN (SELECT friendid AS joinid, 
            userid AS otherid, 
            status 
     FROM   friends 
     WHERE  friendid = 1 
            AND ( ( status != 2 ) 
                  AND ( status != 3 ) ) 
     UNION ALL 
     SELECT userid AS joinid, 
            friendid AS otherid, 
            status 
     FROM   friends 
     WHERE  userid = 1 
            AND ( ( status != 2 ) 
                  AND ( status != 3 ) )) foo 
   ON users.userid = foo.otherid 
  LEFT JOIN users_temp 
      ON users.userid = users_temp.tempuserid

編集:unionallの2番目のサブクエリの列の順序を変更しました。メインクエリにfriendid列が本当に必要ですか?またはotheridは行いますか?

于 2013-03-04T00:50:32.390 に答える