You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL中文本字段统计问题:如何处理非数值类的“平均”需求?

统计MySQL文本列的出现频次(找出出现最多的值)

嘿,这个问题提得很到位!确实AVG()只适用于数值类型的列,没法直接用来统计文本的“出现频率”——咱们得换个思路,用频次统计来实现你要的效果。

第一步:先统计每个文本值的出现次数

如果你想先看到所有文本值各自的出现次数,可以用COUNT()配合GROUP BY:

SELECT clmn_name, COUNT(*) AS occurrence_count
FROM tbl_name
GROUP BY clmn_name;

这个语句会返回类似这样的结果:

clmn_nameoccurrence_count
John50
Kerry10
Michel2
Teddy80

第二步:直接找出出现次数最多的文本值

如果只想得到出现次数最多的那个(比如你的例子里的Teddy),可以在上面的基础上加上排序和限制:

SELECT clmn_name, COUNT(*) AS occurrence_count
FROM tbl_name
GROUP BY clmn_name
ORDER BY occurrence_count DESC
LIMIT 1;

这条语句会直接返回出现次数最高的文本和它的次数,结果就是:

clmn_nameoccurrence_count
Teddy80

进阶:处理多个值出现次数相同的情况

如果有多个文本值出现次数一样多(比如两个值都出现80次),上面的LIMIT 1只会返回其中一个。这时候可以用窗口函数RANK()来获取所有频次最高的结果:

SELECT clmn_name, occurrence_count
FROM (
    SELECT clmn_name, COUNT(*) AS occurrence_count,
           RANK() OVER (ORDER BY COUNT(*) DESC) AS rank_num
    FROM tbl_name
    GROUP BY clmn_name
) AS ranked_results
WHERE rank_num = 1;

这样如果有多个并列第一的文本,都会被列出来。

补充说明

为什么AVG()对文本列无效?因为AVG()是做算术平均值计算的,文本类型的数据没法进行加减乘除这类数值运算,咱们针对文本的统计需求本质是频次统计,所以用COUNT()+GROUP BY才是正确的方向。

内容的提问来源于stack exchange,提问作者PHP Lover

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:33:32