我一直在为此疯狂,但我已经尽我所能。
我有一个包含用户及其组列表的表(这是用户表和组表之间的中间表)。
我需要能够选择一组中但不在另一组中的用户。
我知道我不应该使用!=" on"因为它永远挂起,但我无法弄清楚要使用什么类型的联接。
例如,我想选择" mod_group"中的所有用户。但谁不在" admin_group"。
我已经简化了这个例子,但是我知道他们可能看起来是另一种方法。不幸的是,重写其他地方可能不是一个选择,所以我希望以这种方式找到解决方案。
编辑:添加表格以使其更清晰
这是中间表
| data_user | data_group |
+-----------+------------+
| 1 | 1 |
| 1 | 2 |
| 2 | 2 |
| 3 | 1 |
| 3 | 2 |
| 4 | 2 |
| 5 | 1 |
如果我正在寻找那些在group2但不在group1中的人,那么预期的结果将是返回用户2和4
它需要是dynanmic,所以我可以做相反的事情(查找group1但不是group2的用户,这将返回user5)
答案 0 :(得分:0)
我将假设您的表格结构与以下内容类似:
中间表
user_id | group_id
群组表
id | name
用户表
id | username
您可以对middle_table
中的用户使用条件聚合来识别mod_group
但不在admin_group
中的用户:
SELECT t3.username
FROM middle_table t1
INNER JOIN group_table t2
ON t1.group_id = t2.id
INNER JOIN user_table t3
ON t1.user_id = t3.id
GROUP BY t1.user_id
HAVING COUNT(CASE WHEN t2.name = 'mod_group' THEN 1 ELSE 0 END) >= 1 AND
COUNT(CASE WHEN t2.name = 'admin_group' THEN 1 ELSE 0 END) = 0