计算 DISTINCT 值的出现次数
Posted
技术标签:
【中文标题】计算 DISTINCT 值的出现次数【英文标题】:Count the occurrences of DISTINCT values 【发布时间】:2010-11-23 16:46:07 【问题描述】:我正在尝试找到一个 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
【问题讨论】:
【参考方案1】:SELECT name,COUNT(*) as count
FROM tablename
GROUP BY name
ORDER BY count DESC;
【讨论】:
组在这里做什么?不清楚目的是什么?如果您只是简单地阅读它,它似乎应该没有它。 虽然 Amber 的问题是该问题的正确答案,但我想对她的评论进行更正,以免使新人误入歧途。如果你在 MySQL 查询中去掉“group by”,你不会得到 [Mike, 1], [Mike, 1],你会得到一个结果,它将是返回的第一行上的名称,以及一个计数表中的行数,所以在这种情况下 [Mark, 7]。 count(),作为一个聚合函数作用于整个数据集,对指定的字段进行求和、计数或连接到一行。 Group by 根据指定字段的唯一组合将数据集细分为块 @Avatar_Squadron 非常正确;我已经删除了之前的评论 - 它不在我的脑海中,而且我并不倾向于真正观察没有 group 的 count 的结果。 :) 我一直在努力消除没有重复的结果。您不能将count(*) > 1
放入where
子句中,因为它是一个聚合函数。您还会收到一条非常无用的消息:“无效使用组功能”。正确的方法是将计数命名为name,COUNT(*) as cnt
并添加一个having clause,如下所示:HAVING count > 1
。
@PatrickM 是的,HAVING
用于应在聚合之后应用的条件,而WHERE
用于应在其之前应用的条件。 (另一种思考方式是WHERE
适用于原始行数据;HAVING
适用于输出行数据。)【参考方案2】:
这样的事情怎么样:
SELECT
name,
count(*) AS num
FROM
your_table
GROUP BY
name
ORDER BY
count(*)
DESC
您正在选择名称及其出现的次数,但按名称分组,因此每个名称仅选择一次。
最后,按次数以 DESCending 顺序排列,让出现频率最高的用户排在第一位。
【讨论】:
您的查询帮助了我。结果它返回几行。我也想知道如何找到这个结果的计数。尝试了一些查询,但似乎无法对聚合进行计数。你能帮忙吗? @Nav - 数什么?返回的行数?那是SELECT COUNT(DISTINCT name) as count FROM your_table
要计算表的总行数,请在不使用group by
语句的情况下执行Pascal 的查询。
@AutumnLeonardthanx 人。我从您的评论中得到了答案,然后是答案.. :)【参考方案3】:
刚刚将 Amber 的 COUNT(*) 更改为 COUNT(1) 以获得更好的性能。
SELECT name, COUNT(1) as count
FROM tablename
GROUP BY name
ORDER BY count DESC;
【讨论】:
其实你说的是片面的here以上是关于计算 DISTINCT 值的出现次数的主要内容,如果未能解决你的问题,请参考以下文章