0

以下の SQL ステートメントは、ユーザーの profile_id#s を使用してフレンドシップ テーブルをクエリすることにより、2 つのユーザー要素間のフレンドシップを検索しますが、最近作業ステートメントに追加した行はLEFT OUTER JOIN block_user_filters AS blockedusers on blockedusers.profile_id_1 = 'abcde2'、ユーザー abcde2 が誰かをブロックしているかどうかを確認する場所でした。これらのフレンドシップをLEFT OUTER JOIN block_user_filters AS blockedusers on blockedusers.profile_id_1 = 'abcde2'、ユーザー abcde2 のブロック行が取り込まれたブロック テーブルがある where 句のテーブルから別のフレンドシップ ユーザー要素にフィルター処理したいのですが、ステートメント全体が 0 行を返しています。可能であれば、これを修正するのを手伝ってください。ありがとうございました

SELECT  
  users1.username AS firstusername, 
  users2.username AS secondusername,
  users1.profile_id AS firstprofid,
  users2.profile_id AS secondprofid,
  users1.picup AS firstpicup, 
  users2.picup AS secondpicup
FROM  `users` 
  LEFT OUTER JOIN  `friendship` 
        ON friendship.profile_id_1 = users.profile_id OR friendship.profile_id_2 = users.profile_id
  LEFT OUTER JOIN users AS users1 ON users1.profile_id = friendship.profile_id_1
  LEFT OUTER JOIN users AS users2 ON users2.profile_id = friendship.profile_id_2
  LEFT OUTER JOIN block_user_filters AS blockedusers on blockedusers.profile_id_1 = 'abcde2'
  WHERE users.profile_id = 'abcde2' and blockedusers.profile_id_1 != 'abcde2' and friendship.state = 1 limit 6

編集: 回答とコメントをありがとう、しかし残念ながら試行が null の後でさえ、それはまだ 0 行を返します。 .profid_1 または _2)、それらを UNION と組み合わせますが、これはさらに奇妙な結果になります。頭をまとめる必要があるだけです...

SELECT users1.username AS firstusername, users.username AS secondusername, 
users1.profile_id AS firstprofid, users.profile_id AS secondprofid,
users1.picup AS firstpicup, users.picup AS secondpicup
FROM  `users` 
LEFT OUTER JOIN  `friendship` ON friendship.profile_id_2 = users.profile_id
LEFT OUTER JOIN users AS users1 ON users1.profile_id = friendship.profile_id_1
LEFT OUTER JOIN block_user_filters AS blockedusers on blockedusers.profile_id_1 = 'abcde2'
WHERE users.profile_id = 'abcde2' and blockedusers.profile_id_2 != friendship.profile_id_1 and friendship.state = 1
UNION
SELECT users.username AS firstusername, users.username AS secondusername, 
users.profile_id AS firstprofid, users2.profile_id AS secondprofid,
users.picup AS firstpicup, users2.picup AS secondpicup
FROM  `users` 
LEFT OUTER JOIN  `friendship` ON friendship.profile_id_1 = users.profile_id
LEFT OUTER JOIN users AS users2 ON users2.profile_id = friendship.profile_id_2
LEFT OUTER JOIN block_user_filters AS blockedusers on blockedusers.profile_id_1 = 'abcde2'
WHERE users.profile_id = 'abcde2' and blockedusers.profile_id_2 != friendship.profile_id_2 and friendship.state = 1
4

2 に答える 2

1

これはあなたが探しているものになると思います。最後の結合の最後の行は、友情の 2 番目の ID と一致する必要があります。一致する場合はblockedusers.profile_id_1 IS NULL、WHERE 句の条件によって除外されます。

SELECT users1.username   AS firstusername, 
       users2.username   AS secondusername, 
       users1.profile_id AS firstprofid, 
       users2.profile_id AS secondprofid, 
       users1.picup      AS firstpicup, 
       users2.picup      AS secondpicup 

FROM   friendship 

       LEFT OUTER JOIN users AS users1 
                    ON users1.profile_id = friendship.profile_id_1 
       LEFT OUTER JOIN users AS users2 
                    ON users2.profile_id = friendship.profile_id_2 
       LEFT OUTER JOIN block_user_filters AS blockedusers 
                    ON  blockedusers.profile_id_1 = 'abcde2'
                    AND blockedusers.profile_id_2 IN (users1.profile_id, users2.profile_id)

WHERE  (friendship.profile_id_1 = 'abcde2' or friendship.profile_id_2 = 'abcde2')
       AND friendship.state = 1 
       AND blockedusers.profile_id_1 IS NULL 

LIMIT  6 
于 2013-05-17T16:09:07.973 に答える
0

where句を変更する必要があります。 blockedusers.profile_id_1 != 'abcde2'すべての結果を除外していました。ブロックされたユーザー テーブルに一致があった場合、profile_id_1 の値は「abcde2」でした。一致するものがない場合、そのフィールドに返される値は NULL になり、WHERE 句も失敗します。ブロックされていない友達を取得する代わりに、profile_id_1 IS NULL かどうかを確認してください。

SELECT users1.username   AS firstusername, 
       users2.username   AS secondusername, 
       users1.profile_id AS firstprofid, 
       users2.profile_id AS secondprofid, 
       users1.picup      AS firstpicup, 
       users2.picup      AS secondpicup 
FROM   users 
       LEFT OUTER JOIN friendship 
                    ON friendship.profile_id_1 = users.profile_id 
                        OR friendship.profile_id_2 = users.profile_id 
       LEFT OUTER JOIN users AS users1 
                    ON users1.profile_id = friendship.profile_id_1 
       LEFT OUTER JOIN users AS users2 
                    ON users2.profile_id = friendship.profile_id_2 
       LEFT OUTER JOIN block_user_filters AS blockedusers 
                    ON blockedusers.profile_id_1 = 'abcde2' 
WHERE  users.profile_id = 'abcde2' 
       AND blockedusers.profile_id_1 IS NULL 
       AND friendship.state = 1 
LIMIT  6 
于 2013-05-14T14:11:04.743 に答える