概述
我有两个表 - tmc_users
和 tmc_user_usergroup_map
。
在tmc_users
中,有一个user_id
列表,在tmc_usergroup_map
中,每个user_id
可以与多个group_id
。
我正在尝试查找 group_id
为 12
但没有的所有 user_id
group_id
为 17。
每个用户都可以是两者的成员。
当前查询
这是获取与 group_id
12 关联的所有用户的查询,它返回总共 1439 行:
SELECT `id`, LTRIM(RTRIM(`name`)), COUNT(`id`) AS `total`
FROM `tmc_users` u
LEFT JOIN `tmc_user_usergroup_map` g
ON u.`id` = g.`user_id`
WHERE g.`group_id` = 12
ORDER BY LTRIM(RTRIM(`name`)) ASC
新查询
这是我为了过滤掉 group_id
17 中也的用户所尝试的方法:
SELECT `id`, LTRIM(RTRIM(`name`)), COUNT(`id`) AS `total`
FROM `tmc_users` u
LEFT JOIN `tmc_user_usergroup_map` g
ON u.`id` = g.`user_id`
WHERE g.`group_id` != 17
AND g.`group_id` = 12
ORDER BY LTRIM(RTRIM(`name`)) ASC
但是,这会返回相同的行数 - 1439 - 而实际的用户数应该是 1353。
如何在一个查询中完成这项工作?
最佳答案
您可以使用NOT EXISTS
:
SELECT `id`, LTRIM(RTRIM(`name`)), COUNT(`id`) AS `total`
FROM `tmc_users` u
LEFT JOIN `tmc_user_usergroup_map` g
ON u.`id` = g.`user_id`
WHERE g.`group_id` = 12 AND
NOT EXISTS (SELECT 1
FROM `tmc_user_usergroup_map` AS t
WHERE t.`user_id` = u.`id` AND t.`group_id` = 17)
ORDER BY LTRIM(RTRIM(`name`)) ASC
关于mysql - SQL 查询查找在另一个表中具有某些值的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35914808/