基于表B的LEFT JOIN表A

3

我有一个封锁用户系统:

A表:

-------------------
id_user | username 
-------------------
   1    |    A
-------------------
   2    |    B
-------------------
   3    |    C
-------------------
   4    |    D
-------------------

.... and so on

表格 B:

--------------------------------------
id_block | user_request | user_banned 
--------------------------------------
   1    |       1       |      2
--------------------------------------
   2    |       1       |      3
--------------------------------------
... and so on
案例1:当用户A从表A获取用户列表时,用户B和用户C对他不可见。 案例2:当用户B从表A获取用户列表时,用户A对他不可见。 案例3:当用户C从表A获取用户列表时,用户A对他不可见。 案例4:当用户D从表A获取用户列表时,它获取所有用户。
到目前为止,我已经尝试了这个:
SELECT t1.id_user, t1.username

FROM user t1

  LEFT JOIN block_user t2

    ON (t2.user_request = 1 AND t2.user_banned = 1)

WHERE t1.id_user NOT IN

    (SELECT user_request FROM block_user WHERE user_request = 1 )

  AND t1.id_user NOT IN 

    (SELECT user_banned FROM block_user WHERE user_banned = 1)

结果是用户B和C被隐藏了!太好了!

但是,当您将用户ID更改为示例2时,用户A和C被隐藏。不太好,应该只隐藏用户A!

当您将用户ID更改为4时,用户A、B和C都被隐藏。

我为这个案例做了一些示例:

sqlfiddle 用户ID 1

sqlfiddle 用户ID 2

sqlfiddle 用户ID 3

sqlfiddle 用户ID 4

P.D. 我知道,我可以进行两个查询来解决这个问题,但必须有一个解决方案。


1
这是链接 - Wrikken
1个回答

2
SELECT t1.id_user, t1.username
FROM user t1
LEFT JOIN block_user t2
ON 
   (t2.user_request = <current user id> AND t2.user_banned = t1.id_user)
   OR
   (t2.user_request = t1.id_user AND t2.user_banned = <current user id>)
WHERE t2.id_block IS NULL;

点击此处查看 A、B、C 和 D 的演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接