如何在MySQL中统计表项数关联异表分类及去重项匹配分类?
MySQL分类关联统计解决方案
嘿,我来帮你搞定这两个MySQL统计需求,结合你给出的categories(Table1)和users(Table2)示例表,分两种场景逐一说明:
1. 统计分类对应的表项总数量
这个需求是要把每个分类和users表中属于该分类的记录总数关联起来,哪怕某个分类在users表中没有对应记录,也需要保留该分类的统计结果(显示为0)。
实现SQL
SELECT c.group_name AS 分类名称, COUNT(u.id) AS 表项总数量 FROM categories c LEFT JOIN users u ON c.group_name = u.groups GROUP BY c.group_name, c.id ORDER BY c.id;
结果说明
执行后会得到这样的结果:
| 分类名称 | 表项总数量 |
|---|---|
| football | 3 |
| hockey | 2 |
| tennis | 2 |
关键细节
- 使用
LEFT JOIN确保所有分类都会被返回,不会遗漏没有对应用户的分类; COUNT(u.id)只会统计users表中存在匹配的记录数,没有匹配时会返回0;GROUP BY按分类名称和id分组,保证结果和categories表的顺序一致。
2. 统计分类对应的去重项数
这个需求是要统计users表中每个分类下的唯一用户数量(去重后的项数),避免同一用户重复计入(如果users表存在同一用户多次关联同一分类的情况)。
实现SQL
SELECT c.group_name AS 分类名称, COUNT(DISTINCT u.id) AS 去重后项数 FROM categories c LEFT JOIN users u ON c.group_name = u.groups GROUP BY c.group_name, c.id ORDER BY c.id;
结果说明
针对你的示例数据,结果和第一个需求一致(因为每个用户只关联了一个分类),但如果users表中有同一用户多次属于同一分类的情况,这个查询会自动去重统计唯一用户数。
关键细节
COUNT(DISTINCT u.id)会对每个分类下的用户id去重后再计数,确保同一用户只被统计一次;- 同样使用
LEFT JOIN保留所有分类,保证结果完整性。
内容的提问来源于stack exchange,提问作者Jonah Etuaful
相关产品推荐
相关产品推荐

