MySQL查询优化:获取出现3次及以上的userID对应行或ID列表
解决MySQL查询重复userID的问题
首先来说说你原来的查询为什么会出问题:你在主查询里加了GROUP BY userID,这会让MySQL只返回每个userID的一行数据(如果没开启ONLY_FULL_GROUP_BY模式,还可能随机返回该行的其他字段值),这就导致你看到的结果里,虽然userID满足出现3次及以上的条件,但只显示了其中一行,看起来像是只出现了1次。另外,这个外层的GROUP BY完全不符合你要返回所有完整行的需求,得去掉。
下面是针对两类需求的正确查询:
一、返回所有userID出现3次及以上的完整行数据
你可以用子查询先筛选出符合条件的userID,再关联原表获取所有对应行,两种写法都可以:
写法1:使用IN子查询
SELECT * FROM myTable WHERE userID IN ( SELECT userID FROM myTable GROUP BY userID HAVING COUNT(*) >= 3 );
写法2:使用JOIN(效率通常更高)
SELECT t.* FROM myTable t INNER JOIN ( SELECT userID FROM myTable GROUP BY userID HAVING COUNT(*) >= 3 ) AS user_counts ON t.userID = user_counts.userID;
这两种写法都会返回所有userID出现次数≥3的完整记录,不会丢失任何符合条件的行。
二、返回所有出现3次及以上的userID列表
这个需求更简单,直接用子查询的部分即可,不需要关联原表:
SELECT userID FROM myTable GROUP BY userID HAVING COUNT(*) >= 3;
这样就能得到所有满足出现次数要求的userID清单啦。
内容的提问来源于stack exchange,提问作者Liam Paquette
相关产品推荐
相关产品推荐

