SQL查询:获取被超过10位用户选择的颜色名称
解决方案
没问题,这是个很常见的分组统计需求,我给你两种可行的SQL写法,还会说明各自的适用场景:
写法一:直接关联后分组筛选
这种写法逻辑直观,适合数据量不大的场景:
SELECT c.color_name FROM User u JOIN Color c ON u.c_id = c.c_id GROUP BY u.c_id, c.color_name HAVING COUNT(u.u_id) > 10;
关键步骤解释:
JOIN Color c ON u.c_id = c.c_id:把用户选择的颜色ID和颜色表关联,拿到对应的颜色名称。GROUP BY u.c_id, c.color_name:按颜色ID和名称分组(虽然理论上一个c_id对应唯一的color_name,但一起分组能避免数据异常导致的错误)。HAVING COUNT(u.u_id) > 10:必须用HAVING而不是WHERE,因为我们要筛选的是分组后的统计结果(用户数量超过10),WHERE只能在分组前过滤行数据。
写法二:子查询先统计再关联
如果你的User表数据量很大,这种写法性能会更好——先在子查询里完成统计筛选,减少后续关联的数据量:
SELECT c.color_name FROM ( SELECT c_id FROM User GROUP BY c_id HAVING COUNT(u_id) > 10 ) AS color_counts JOIN Color c ON color_counts.c_id = c.c_id;
额外提示:
题目提到每位用户仅能选择一种颜色,所以User表的u_id应该是唯一的,直接COUNT(u_id)就足够准确。如果实际存在重复的u_id(比如脏数据),可以改成COUNT(DISTINCT u.u_id),确保每个用户只被统计一次。
内容的提问来源于stack exchange,提问作者Alex Q
相关产品推荐
相关产品推荐

