MySQL将连接表留给了自己

时间:2016-09-19 07:34:57

标签: mysql join

我一直在为此疯狂,但我已经尽我所能。

我有一个包含用户及其组列表的表(这是用户表和组表之间的中间表)。

我需要能够选择一组中但不在另一组中的用户。

我知道我不应该使用!=" 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)

1 个答案:

答案 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