MySQL:计算不同值的出现次数

Jim*_*myJ 212 mysql sql database distinct

我试图找到一个MySQL查询,它将在特定字段中查找不同的值,计算该值的出现次数,然后按计数对结果进行排序.

示例db

id         name
-----      ------
1          Mark
2          Mike
3          Paul
4          Mike
5          Mike
6          John
7          Mark
Run Code Online (Sandbox Code Playgroud)

预期结果

name       count
-----      -----
Mike       3
Mark       2
Paul       1
John       1
Run Code Online (Sandbox Code Playgroud)

谢谢

Amb*_*ber 384

SELECT name,COUNT(*) as count FROM tablename GROUP BY name ORDER BY count DESC;
Run Code Online (Sandbox Code Playgroud)

  • 虽然Amber的查询是这个问题的正确答案,但我想对她的评论进行更正,以避免让新人误入歧途.如果你在MySQL查询中不使用"group by",你就不会得到[Mike,1],[Mike,1],你会得到一个结果,它将是返回的第一行上的名字,以及一个计数表中的行数,因此在这种情况下[Mark,7].count(),因为聚合函数适用于整个数据集,将指定字段汇总,计数或汇总到一行.通过基于指定字段的唯一组合将数据集细分为块来进行分组 (18认同)
  • @PatrickM是的,`HAVING`用于聚合后应该应用的条件,而`WHERE`用于应该在它之前应用的条件.(另一种思考方式是`WHERE`适用于原始行数据;`HAVING`适用于输出行数据.) (4认同)
  • 这个团体到底是做什么的?不清楚目的是什么?如果你只是简单地阅读它,它似乎应该可以解决它。 (2认同)
  • 我努力解决的问题是消除没有重复的结果.你不能把`count(*)> 1`扔进`where`子句,因为它是一个聚合函数.您还会收到一条非常无用的消息:"无效使用组功能." 正确的方法是将计数`name,COUNT(*)别名为cnt`并添加[having子句](http://dev.mysql.com/doc/refman/5.0/en/group-by-extensions. html)像这样:`HAVING count> 1`. (2认同)
  • 对于构造良好的SQL语句,有一些非常令人满意的东西. (2认同)

Pas*_*TIN 13

这样的事情怎么样:

select name, count(*) as num
from your_table
group by name
order by count(*) desc
Run Code Online (Sandbox Code Playgroud)

即,您正在选择名称和出现的次数; 但按名称分组,因此每个名称只选择一次.

然后,你按次数订购,desc; 让出现频率最高的用户排在第一位.


Aer*_*rin 5

只需将Amber的COUNT(*)更改为COUNT(1)即可获得更好的性能。

SELECT name, COUNT(1) as count 
FROM tablename 
GROUP BY name 
ORDER BY count DESC;
Run Code Online (Sandbox Code Playgroud)