MySQL:如何LEFT JOIN WHERE为NULL(user1阻止user2 OR颠倒)?

时间:2012-06-12 13:41:12

标签: mysql database left-join

我有一个表格user,另外还有INNER JOIN表格cities以及其他一些表格。现在我还有下表:

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

如何使用LEFT JOIN WHERE IS NULL,以便从搜索结果中排除两个用户组合(user1阻止user2或user2阻止user1)?

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

非常感谢您的帮助!

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分: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 NULL构造是有意义的,因为你确实在检查两种不同的情况。