mysql - SQL 查询查找在另一个表中具有某些值的用户

标签 mysql sql

概述

我有两个表 - tmc_userstmc_user_usergroup_map

tmc_users中,有一个user_id列表,在tmc_usergroup_map中,每个user_id可以与多个group_id

我正在尝试查找 group_id12没有的所有 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/

相关文章:

mysql - 如何使用存储过程更新另一个表中的所有列和行

mysql - 如何为 MySQL 中的每个新人分配重新启动的自动递增 ID?

mysql - C 应用程序特殊字符 Äöü 未在 MySQL 和终端中正确显示

sql - 在 SQL 中存储任意(可能标记的)文本的规范方法是什么?

MySQL,如何获取行之间的时间差

MySQL 外键约束的形成不正确

php - 如果为正,mysql 减少计数器

mysql - 通过唯一标识符连接 MySQL 中的多个表

php - 为什么我的 SQL 查询返回一个数组?

sql - 姓名姓氏相似度搜索