MySQL表中查询使用频次最高与最低值的问题
嘿,我完全懂你现在的困扰——把分散在两列里的站点值合并后,没法正确统计并按出现频次排序对吧?别慌,咱们一步步拆解解决这个问题:
第一步:先把两列数据完整合并(关键!别丢重复值)
首先得把两个站点列的所有值合并成一个数据集,这里一定要用UNION ALL而不是UNION!因为UNION会自动去重,直接就丢了频次统计需要的重复数据。假设你的票务表叫ticket_table,两个站点列是site_a和site_b,那合并语句可以这么写:
SELECT site_a AS site_value FROM ticket_table UNION ALL SELECT site_b AS site_value FROM ticket_table
这一步会输出所有站点值的完整列表,包括每一次出现的重复项,不会漏掉任何频次信息。
第二步:统计每个站点的出现次数
把上面的合并结果作为子查询,用GROUP BY和COUNT()来统计每个站点的频次:
SELECT site_value, COUNT(*) AS occurrence_count FROM ( SELECT site_a AS site_value FROM ticket_table UNION ALL SELECT site_b AS site_value FROM ticket_table ) AS combined_sites GROUP BY site_value
到这里你就能得到每个站点对应的准确出现次数了,比如你说的2000会显示4次,2001显示1次。
第三步:按频次排序,精准定位最高/最低值
现在只需要加ORDER BY就能按频次排序,再用LIMIT锁定目标:
- 找频次最高的站点(比如你的2000):
SELECT site_value, COUNT(*) AS occurrence_count FROM ( SELECT site_a AS site_value FROM ticket_table UNION ALL SELECT site_b AS site_value FROM ticket_table ) AS combined_sites GROUP BY site_value ORDER BY occurrence_count DESC LIMIT 1;
- 找频次最低的站点(比如你的2001):
SELECT site_value, COUNT(*) AS occurrence_count FROM ( SELECT site_a AS site_value FROM ticket_table UNION ALL SELECT site_b AS site_value FROM ticket_table ) AS combined_sites GROUP BY site_value ORDER BY occurrence_count ASC LIMIT 1;
如果有多个站点频次相同(比如多个都只出现1次),去掉LIMIT 1就能看到所有符合条件的站点。
避坑提醒
- 绝对别用
UNION代替UNION ALL!这是最容易踩的坑,UNION会合并重复行,直接导致统计的频次比实际少,大概率是你之前排序出错的原因。 - 确保两列数据类型一致,如果一列是数字一列是字符串,合并后可能会统计异常,必要时用
CAST()统一类型,比如CAST(site_a AS CHAR) AS site_value。
内容的提问来源于stack exchange,提问作者user8795980
相关产品推荐
相关产品推荐

