phpmysql统计数据库同值列数量生成汇总表的SQL查询方法
问题场景
你的MySQL数据库中存在一张包含3个字段的表,字段分别为id(主键)、country、name,表中同一country字段存在多条重复对应记录,需要按country分组统计对应记录总条数,生成带连续序号、国家名称、记录条数的汇总结果。
实现SQL语句
注意将语句中的你的表名替换为实际使用的表名称。
MySQL 8.0及以上版本(支持窗口函数)
SELECT ROW_NUMBER() OVER (ORDER BY MIN(id)) AS id, TRIM(country) AS Country, COUNT(*) AS Count FROM 你的表名 GROUP BY TRIM(country) ORDER BY MIN(id);
MySQL 5.x 低版本(不支持窗口函数)
SELECT @row_num := @row_num + 1 AS id, t.Country, t.Count FROM ( SELECT TRIM(country) AS Country, COUNT(*) AS Count FROM 你的表名 GROUP BY TRIM(country) ORDER BY MIN(id) ) t, (SELECT @row_num := 0) r;
语句说明
- 使用
TRIM(country)处理国家字段前后的多余空格,避免原始数据中因排版、录入问题产生的前后空格导致相同国家被识别为不同分组 - 通过
GROUP BY对国家字段分组,COUNT(*)统计每个国家对应的记录总数 - 排序规则使用
MIN(id),即按每个国家在原表中首次出现的主键id升序排列,和示例输出顺序完全匹配:USA首次出现在id=1排第1位,Japan首次出现在id=5排第2位,india首次出现在id=7排第3位 - 汇总结果中的
id是查询生成的连续自增序号,并非原表的主键id
结果对照
执行语句后输出的结果和需求示例完全一致:
| id | Country | Count |
|---|---|---|
| 1 | USA | 4 |
| 2 | Japan | 2 |
| 3 | india | 3 |
内容的提问来源于stack exchange,提问作者rajats
相关产品推荐
相关产品推荐

