MySQL按MCall分组计算LOG表积分及去重统计区域数量问题咨询
问题1解决方案
你的原查询直接对sm、mm非空的情况各加1分,没有处理两个值相等时要扣减1分的规则,可改用CASE WHEN逐行计算单条记录的积分后再聚合,同时移除不需要的非聚合字段sm、mm和冗余的DISTINCT:
SELECT MCall, SUM( CASE WHEN sm != '' AND mm != '' THEN IF(sm = mm, 1, 2) WHEN sm != '' OR mm != '' THEN 1 ELSE 0 END ) AS points FROM LOG WHERE conf = '1' GROUP BY MCall ORDER BY points DESC
逻辑说明:
- 仅处理conf=1的有效记录
- 当sm和mm都非空时:相等得1分,不等得2分
- 只有单个字段非空时得1分
- 两个都为空得0分
问题2解决方案
COUNT(DISTINCT sm, mm)统计的是(sm,mm)值对的去重数量,不符合你要合并两个字段值再去重统计的需求,可先通过UNION ALL将sm、mm拆为单列,再聚合统计:
SELECT MCall, COUNT(DISTINCT area_val) AS areas FROM ( SELECT MCall, sm AS area_val FROM LOG WHERE conf = '1' AND sm != '' UNION ALL SELECT MCall, mm AS area_val FROM LOG WHERE conf = '1' AND mm != '' ) AS t GROUP BY MCall
逻辑说明:
- 内层查询分别取出所有有效记录的非空sm、mm值,统一到
area_val字段 - 外层按MCall分组,对合并后的区域值去重计数,结果和预期一致
内容的提问来源于stack exchange,提问作者user3260939
相关产品推荐
相关产品推荐

