mysql - 创建用户到组的映射,并根据用户组合获取组

标签 mysql database

我有一组用户和组。用户可以属于一个或多个组,组可以有一个或多个用户。所以我得到了 user_groups 的连接表。

有没有一种方法可以根据用户的确切组合找出组的名称?我不确定我为此设置的结构是否可以正确执行,但是这里有两个例子:

ID 为 1 (Jeff) 的用户属于两个组,如 user_groups 表所示。对于 ID 为 2 的组,他是唯一的成员。而对于另一组 ID 4,他是两个成员之一。

我希望能够构建一个查询,如果我只有他的 ID,我就会知道组名是 GP-B,因为那是映射。如果我有用户 ID 14,它们映射到组 4,所以我知道组名称是 GP-D。

SELECT id, name FROM users;

1, Jeff
2, John
3, Mary
4, Jen
5, Mike

SELECT id, name FROM groups;

1, GP-A
2, GP-B
3, GP-C
4, GP-D

SELECT user_id, group_id FROM user_groups;

1, 2
1, 4
2, 3
4, 1
4, 4

到目前为止我能想到的最好的查询是:

SELECT groups.name 
FROM user_groups
LEFT JOIN groups
    ON groups.id = user_groups.group_id
WHERE user_id IN (1,4)
GROUP BY group_id
HAVING COUNT(*) = 2;

这似乎奏效了。但是,如果我只做单个用户:

SELECT groups.name 
FROM user_groups
LEFT JOIN groups
    ON groups.id = user_groups.group_id
WHERE user_id IN (1)
GROUP BY group_id
HAVING COUNT(*) = 1;

它最终拉动了他所属的两个组,所以我的查询有些不正确。

最佳答案

您只需要在 JOIN 条件中移动 WHERE 表达式 - user_id IN (1):

SELECT groups.name 
FROM user_groups
LEFT JOIN groups
    ON groups.id = user_groups.group_id AND user_id IN (1)
GROUP BY group_id
HAVING COUNT(*) = 1 AND groups.name IS NOT NULL;

(并在 HAVING 子句中设置过滤器,以便排除 NULL 组 - 那些不匹配的组)

通过这种方式,您将从 user_groups 中获取所有行,然后您将能够确保计数将获取您输入的准确记录数。

在您的初始查询中,WHERE 子句过滤掉了一些行,因此您实际上无法正确计算每个组中有多少成员(因为您排除了那些与您的过滤器不匹配的成员) .

关于mysql - 创建用户到组的映射,并根据用户组合获取组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36648966/

相关文章:

java.lang.unsupportedoperationexception 应用程序必须提供 JDBC 连接

php - 在 where 中获取以逗号分隔的数据

mysql - 将 MySQL POINT 数据类型转换为 PostgreSQL

javascript - 带有json_encode的php mysql输出数组到javascript不产生输出

mysql - SELECT mySql 查询中的中性值

MySQL 8 Select语句得到 'Last_query_cost'

java - 如何更新数据库,同时在我们的服务器端进行更改

linux - 如何加快对大量文本文件 (1TB) 的搜索

mysql - 在主键上创建和索引有什么好处吗?

php - CakePHP模型SQL查询条件参数