下面三个 SQL 表描述了谁属于哪个组。例如,Ann 属于 A/B 组,Ben 属于 B/C 组,Chris 属于 A/C 组。
现在,当我想搜索“Ann AND Ben 所属的组”时,我们应该如何编写 SELECT 查询?或者我们应该以不同的方式设计这些表?
(1) 个用户
+-----------+------------------+
| member_id | member_name |
+-----------+------------------+
| 1 | Ann |
| 2 | Ben |
| 3 | Chris |
+-----------+------------------+
(2)组
+-----------+------------------+
| group_id | group_name |
+-----------+------------------+
| 1 | Group A |
| 2 | Group B |
| 3 | Group C |
+-----------+------------------+
(3) 个用户组
+-----------+------------------+
| group_id | user_id |
+-----------+------------------+
| 1 | 1 |
| 2 | 1 |
| 2 | 2 |
| 3 | 2 |
| 1 | 3 |
| 3 | 3 |
+-----------+------------------+
最佳答案
SELECT group_id, group_name
FROM groups
JOIN users_groups ON groups.group_id = users_groups.group_id
JOIN users ON users_groups.user_id = users.member_id
WHERE member_id = 1
INTERSECT
SELECT group_id, group_name
FROM groups
JOIN users_groups ON groups.group_id = users_groups.group_id
JOIN users ON users_groups.user_id = users.member_id
WHERE member_id = 2
这将给出 Ann 和 Ben 所在的所有组的组 ID 和名称。如果您想按名称而不是 ID 进行搜索,请随意将 member_id = # 子句替换为 member_name = 'name'。
编辑:我忘记了 MySQL 没有 INTERSECT。因此上面的代码适用于大多数 DBMS,但下面的代码应该返回 MySQL 所需的结果。
SELECT groups.group_id, groups.group_name
FROM groups
JOIN users_groups ON groups.group_id = users_groups.group_id
JOIN users ON users_groups.user_id = users.member_id
WHERE member_id = 1
AND groups.group_id IN (SELECT groups.group_id
FROM groups
JOIN users_groups ON groups.group_id = users_groups.group_id
JOIN users ON users_groups.user_id = users.member_id
WHERE member_id = 2)
关于MySQL:使用 AND 条件从组成成员中搜索组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37602162/