MySQL查询修改:统计各水果去重数及重复总数需求
解决MySQL水果统计需求:去重数量+总重复次数
没问题,我来帮你搞定这个统计需求!先理清楚两个核心指标的逻辑:
- 去重数量:每种水果对应的唯一记录数(比如同一水果但不同属性的条目算不同的唯一记录)
- 总重复次数:该水果的总记录数减去去重后的数量,也就是所有重复记录的总和
假设你的表名为fruit_records,存储水果名称的列是fruit_name,同时你需要基于color、weight这些字段判断记录是否重复(可根据你的实际表结构调整),可以用下面的SQL查询:
SELECT fruit_name, COUNT(*) AS total_records, -- 用CONCAT_WS拼接需要判断重复的列,避免NULL影响去重逻辑 COUNT(DISTINCT CONCAT_WS('|', fruit_name, color, weight)) AS distinct_count, -- 总重复次数 = 总记录数 - 去重后的唯一记录数 COUNT(*) - COUNT(DISTINCT CONCAT_WS('|', fruit_name, color, weight)) AS total_dup_count FROM fruit_records GROUP BY fruit_name;
关键细节说明:
- 如果你的去重逻辑只需要基于某一列(比如唯一标识列
fruit_id),直接把CONCAT_WS(...)换成该列即可,比如COUNT(DISTINCT fruit_id) CONCAT_WS的作用是把多列拼接成一个字符串,确保只有当所有指定列都相同时,才会被判定为重复记录,分隔符|可以换成其他不会出现在字段值里的符号- 如果你的需求是仅统计水果名称本身的重复(即不管其他属性,只要水果名相同就算重复),那去重数量固定为1,总重复次数就是
COUNT(*) - 1,对应的查询可以简化:
SELECT fruit_name, 1 AS distinct_count, COUNT(*) - 1 AS total_dup_count FROM fruit_records GROUP BY fruit_name;
举个实际数据的例子,假设你的表有这些数据:
| fruit_name | color | weight |
|---|---|---|
| 苹果 | 红 | 100 |
| 苹果 | 红 | 100 |
| 苹果 | 绿 | 120 |
| 香蕉 | 黄 | 80 |
| 香蕉 | 黄 | 80 |
| 香蕉 | 黄 | 80 |
用第一个查询得到的结果会是:
| fruit_name | total_records | distinct_count | total_dup_count |
|---|---|---|---|
| 苹果 | 3 | 2 | 1 |
| 香蕉 | 3 | 1 | 2 |
完全符合你要的两个统计值~
内容的提问来源于stack exchange,提问作者vardha
相关产品推荐
相关产品推荐

