同一查询错误中的COUNT DISTINCT和GROUP BY

时间:2015-02-24 01:54:55

标签: mysql database relational-database

我有以下数据:

countryId languageUsed
1          English
1          France
2          English
2          Spanish
3          Italian
1          Russian

当我查询时:

SELECT count(DISTINCT countryId) 
FROM languages
GROUP BY countryId

我明白了:

count(DISTINCT countryId)
1
1
1

而不仅仅是3.当我删除GROUP BY子句时,它会给我正确的结果。

有人可以解释这种行为的原因是什么。

2 个答案:

答案 0 :(得分:1)

GROUP BY的目的是占用几行并将它们变成一行。如果是这样,它必须知道如何处理具有不同值的所有组合行。这就是为什么你想要SELECT的每个字段都有两个选项,可以将它包含在GROUP BY子句中,或者在聚合函数中使用它,这样系统就知道你想要如何组合字段

您还遇到了GROUP BY条款的严格要求。哪个不在GROUP BY子句中的列必须应用一个函数来减少匹配"组的所有记录"单个记录,例如SUMMAXMINAVG和其他记录。

如果列出GROUP BY子句中的所有选定列,则实质上是要求从结果集中排除重复记录。这与SELECT DISTINCT具有相同的效果,这也消除了结果集中的重复行。

除非你非常想要同时使用它们并获得所需的结果,否则你可以使用SUM。见下文:

 SELECT SUM(countryId) FROM 
   (
    SELECT COUNT(DISTINCT countryId)countryId
    FROM languages
    GROUP BY countryId
   ) AS A

<强> SEE DEMO HERE

答案 1 :(得分:0)

如果您只想计算不同的count(),则不应将group bycolumn用于查询中的同一countryId。结果是这样的,因为它将返回的count(DISTINCT countryId)分发到多个row(因为GROUP BY countryId子句),而不是只返回一个row。代码count(DISTINCT countryId)就足够了。