如何在MySQL中使用子查询获取所有唯一名称及其出现次数?
问题分析与解决方案
你的这个思路其实是不对的,咱们来拆解下问题出在哪,再看看正确的做法~
为什么你的查询得不到想要的结果?
你写的子查询 (select count(distinct(etunimi)) as määrä from jasenet) 是在全局统计整个表中有多少种不同的名字,所以不管哪一行的 etunimi 是什么,对应的 määrä 都会是同一个总数,自然没法得到每个名称各自的出现次数。
正确的实现方法
要统计每个唯一名称的出现次数,最标准也最高效的做法是用 GROUP BY 子句,它会把相同 etunimi 的行归为一组,然后用聚合函数统计每组的数量:
SELECT etunimi, COUNT(*) AS määrä FROM jasenet GROUP BY etunimi;
语句解释:
GROUP BY etunimi:将表中所有行按照etunimi的值分组,相同名字的行被分到同一组COUNT(*):统计每组内的行数,也就是该名称的出现次数
如果你的 etunimi 字段可能存在 NULL 值,并且你不想统计这些 NULL 的话,可以加个过滤条件:
SELECT etunimi, COUNT(*) AS määrä FROM jasenet WHERE etunimi IS NOT NULL GROUP BY etunimi;
额外实用技巧
- 如果想按出现次数从多到少排序,可以追加
ORDER BY子句:SELECT etunimi, COUNT(*) AS määrä FROM jasenet GROUP BY etunimi ORDER BY määrä DESC; - 如果只想筛选出现次数大于某个值的名称(比如至少出现2次),可以用
HAVING子句(注意:HAVING是在分组后过滤结果,不能用WHERE):SELECT etunimi, COUNT(*) AS määrä FROM jasenet GROUP BY etunimi HAVING COUNT(*) > 2 ORDER BY määrä DESC;
内容的提问来源于stack exchange,提问作者nyoatype
相关产品推荐
相关产品推荐

