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。