mysql 第一张表为用户表,第二张表为用户与组织的关系表,用户与组织一对多的关系,已知多个用户组织id,查询哪些用户属于这些组织
你希望从组织 ID 为 1、2、3 的用户中查询,同时列出他们所有的组织 ID,包括那些不在 1、2、3 之中的,如 4 和 5。这样,我们需要一个两步的查询:
- 首先,找到组织 ID 为
1、2、3 的用户。
- 然后,查询这些用户所拥有的所有组织 ID。
我们可以使用子查询来实现这一点:
SQL 查询示例
SELECT u.user_id, u.user_name, GROUP_CONCAT(uo.organization_id ORDER BY uo.organization_id) AS organization_ids
FROM users u
JOIN user_organization uo ON u.user_id = uo.user_id
WHERE u.user_id IN (
SELECT uo.user_id
FROM user_organization uo
WHERE uo.organization_id IN (1, 2, 3)
)
GROUP BY u.user_id, u.user_name;
解释
- 子查询部分:
SELECT uo.user_id FROM user_organization uo WHERE uo.organization_id IN (1, 2, 3) 用于找到所有组织 ID 为 1, 2, 3 的用户 ID。
- 主查询部分:
JOIN 连接 users 表和 user_organization 表,以获取用户及其所有组织 ID。
WHERE u.user_id IN (...) 仅选择在子查询中找到的用户 ID。
GROUP_CONCAT(uo.organization_id ORDER BY uo.organization_id) 聚合用户的所有组织 ID,并按升序排列。
示例
假设 Alice 拥有组织 ID 1, 2, 4, 5,Bob 拥有组织 ID 2, 3,Charlie 拥有组织 ID 1, 2, 3, 4,而你查询的组织 ID 是 1, 2, 3,那么查询结果会是:
| user_id |
user_name |
organization_ids |
| 1 |
Alice |
1,2,4,5 |
| 2 |
Bob |
2,3 |
| 3 |
Charlie |
1,2,3,4 |
在这个结果中,organization_ids 列包括用户所拥有的所有组织 ID,而不仅仅是查询条件中的那些组织 ID。