MySQL查询ceID=1113且无其他ceID关联记录的用户
问题背景
现有usersTable表,存储用户和关联ceID的对应关系,表中样本数据如下:
+--------------------+------+ | user_ID | ceID | +--------------------+------+ | 20201011_557141020 | 1136 | | 20201118_936245153 | 1113 | | 20200224_856349817 | 1113 | | 20201021_979024023 | 1139 | | 20201021_979024023 | 1146 | | 20201104_500741407 | 1139 | | 20201021_979024023 | 1147 | | 20201021_979024023 | 1113 | | 20210412_238528636 | 1118 | | 20220523_576943860 | 1113 | | 20220523_576943860 | 1119 | | 20220522_893258175 | 1119 | +--------------------+------+
需求为查询所有ceID=1113,且不存在任何其他ceID关联记录的用户。
直接查询ceID=1113会返回4个用户,其中20201021_979024023、20220523_576943860两个用户同时关联了其他ceID,需要排除,最终期望结果为:
+--------------------+------+ | user_ID | ceID | +--------------------+------+ | 20201118_936245153 | 1113 | | 20200224_856349817 | 1113 | +--------------------+------+
原有SQL错误分析
你编写的SQL如下:
select user_ID from clubUsers where ceID=1113 and not exists (select user_ID clubUsers where ceID != 1113) ;
存在两个核心问题:
- 子查询语法错误:缺少
FROM关键字,select user_ID clubUsers应为select user_ID from clubUsers - 子查询未做关联:子查询没有和外层查询按
user_ID绑定,会全局判断「表中是否存在任意ceID≠1113的记录」,只要表中存在一条其他ceID的记录,NOT EXISTS条件就永远不成立,无法按用户维度判断是否有其他关联ceID。
正确实现方案
方案1:修正关联逻辑的NOT EXISTS写法
通过子查询关联同一个用户的记录,判断该用户是否存在其他ceID的关联条目:
SELECT DISTINCT user_ID, ceID FROM usersTable t1 WHERE ceID = 1113 AND NOT EXISTS ( SELECT 1 FROM usersTable t2 WHERE t2.user_ID = t1.user_ID AND t2.ceID <> 1113 );
注:如果你的实际表名是
clubUsers,把SQL里的usersTable替换为对应表名即可。
方案2:分组聚合写法
按用户ID分组,通过聚合条件筛选出仅关联ceID=1113的用户,逻辑更直观:
SELECT user_ID, 1113 AS ceID FROM usersTable GROUP BY user_ID HAVING COUNT(DISTINCT ceID) = 1 AND MIN(ceID) = 1113;
两种写法执行后都会返回你期望的2条用户记录,自动排除同时关联了其他ceID的用户。
内容的提问来源于stack exchange,提问作者rolinger
相关产品推荐
相关产品推荐

