2

私はテーブルを持っており、それuserに加えINNER JOINてテーブルcitiesと他のいくつかのテーブルがすでにあります。今、私は次の表も持っています:

blocked_user
--------------------------------------------------------
id | user1_id | user2_id | timestamp

どうすれば使用できLEFT JOIN WHERE IS NULLますか?両方のユーザーの組み合わせ(user1がuser2をブロックしたかuser2がuser1をブロックした)が検索結果から除外されますか?

user
--------------------------------------------------------
id | username | ...

よろしくお願いします!

4

2 に答える 2

2

この場合、キーワードNOT EXISTSは、少なくとも意味的には意味的には適切ではないと思います。

SELECT * FROM user u
WHERE NOT EXISTS (
    SELECT * FROM blocked_user b 
    WHERE 
        b.user1_id = u.id 
    OR  b.user2_id = u.id
)

確かに使用するオプションもあります:

SELECT * FROM user u LEFT JOIN blocked_user b ON b.user1_id = u.id 
                                              OR b.user2_id = u.id
WHERE b.id IS NULL

しかし、パフォーマンスに関しては、どちらがより効率的かわかりません。

rgds。

于 2012-06-12T13:46:39.473 に答える
2

現在のユーザー(リクエストを実行しているユーザー)がいて、ブロックしたすべてのユーザーまたはブロックしたすべてのユーザーを非表示にしたいと考えています。user1_idまた、それがブロックを行ったユーザーであり、ブロックしたユーザーであると想定していuser2_idます。これらの点をより明確にするために、質問を編集する必要があります。

そうだとすれば、これが私がすることです:

SELECT id, username

FROM user

LEFT JOIN (
    SELECT DISTINCT user2_id AS blockee_id
    FROM blocked_user
    WHERE user1_id = :current_user_id
) this_user_blocked
ON user.id = this_user_blocked.blockee_id

LEFT JOIN (
    SELECT DISTINCT user1_id AS blocker_id
    FROM blocked_user
    WHERE user2_id = :current_user_id
) blocked_this_user
ON user.id = blocked_this_user.blocker_id

WHERE this_user_blocked.blockee_id IS NULL
AND blocked_this_user.blocker_id IS NULL

LEFT JOIN ... WHERE ... IS NULL2つの異なる状況を実際にチェックしているので、2つの別々の構成を使用することは理にかなっていると思います。

于 2012-06-12T13:50:37.477 に答える