计算DISTINCT值的出现


218

我正在尝试找到一个MySQL查询,该查询将在特定字段中找到DISTINCT值,计算该值的出现次数,然后按计数顺序对结果进行排序。

示例数据库

id         name
-----      ------
1          Mark
2          Mike
3          Paul
4          Mike
5          Mike
6          John
7          Mark

预期结果

name       count
-----      -----
Mike       3
Mark       2
Paul       1
John       1

Answers:


395
SELECT name,COUNT(*) as count 
FROM tablename 
GROUP BY name 
ORDER BY count DESC;

2
小组在这里做什么?目前尚不清楚目的是什么?如果您只是简单地阅读它,似乎应该可以解决它。
詹姆斯

19
尽管Amber的疑问是该问题的正确答案,但我想对她的评论进行更正,以免使新人们误入歧途。如果您在MySQL查询中省略了“分组依据”,则不会得到[Mike,1],[Mike,1],只会得到一个结果,该结果将是返回的FIRST行上的名称以及一个计数表中的行数,因此在这种情况下为[Mark,7]。count(),因为聚合函数适用于整个数据集,所以将指定字段累加,计数或压缩为一行。分组依据根据指定字段的唯一组合将数据集细分为多个数据块
Avatar_Squadron 2012年

3
我努力解决的事情是消除没有重复的结果。您不能将a count(*) > 1放入where子句中,因为它是聚合函数。您还会收到一条非常无用的消息:“无效使用组功能”。正确的方法是为count name,COUNT(*) as cnt加上别名,并添加一个hading子句,如下所示:HAVING count > 1
Patrick M

4
@PatrickM是的,HAVING适用于应在聚合之后应用的条件,而适用于应在聚合WHERE之前应用的条件。(另一种思考方式是WHERE适用于原始行数据;HAVING适用于输出行数据。)
琥珀色

2
构造良好的SQL语句令人非常满意。
约书亚·品特

14

那么这样的事情呢:

SELECT
  name,
  count(*) AS num
FROM
  your_table
GROUP BY
  name
ORDER BY
  count(*)
  DESC

您正在选择名称及其出现的次数,但是按名称分组,因此每个名称仅被选择一次。

最后,您按DESCending顺序排序,以使出现频率最高的用户排在首位。


您的查询对我有所帮助。结果返回几行。我还想知道如何找到该结果的计数。尝试了一些查询,但似乎无法对合计进行计数。你能帮忙吗?
2013年

@Nav-算什么?返回的行数?这SELECT COUNT(DISTINCT name) as count FROM your_table对于总表行数,做帕斯卡的查询,而不该group by声明。
秋季伦纳德

一分钟有何不同!
Chuck Le Butt

6

只是将Amber的COUNT(*)更改为COUNT(1)以获得更好的性能。

SELECT name, COUNT(1) as count 
FROM tablename 
GROUP BY name 
ORDER BY count DESC;

1
其实你说的部分在这里
詹姆斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.