func.count(distinct(...))没有给出与distinct()相同的结果.count()

时间:2013-09-16 07:12:15

标签: mysql sql sqlalchemy

我有一个包含空条目的列,例如此列中的可能值为None, 1, 2, 3

当我使用session.query(func.count(distinct(Entry.col))).scalar()计算列中唯一条目的数量时,我会返回'​​3'。

但是当我用session.query(Entry.col).distinct().count()执行计数时,我会回到'4'。

为什么后一种方法会计算None,但第一种方法不计算?

2 个答案:

答案 0 :(得分:2)

在第一种情况下,生成的查询将如下所示:

SELECT COUNT(DISTINCT(col)) FROM Entry

...而且,正如您可能已经知道的那样,此处COUNT实际上并不会计算NULL值。

但在第二种情况下,查询不同,如the doc

所示
SELECT count(1) AS count_1 FROM (
    SELECT DISTINCT(col) FROM Entry
) AS anon_1

现在,只计算SELECT DISTINCT查询返回的行总数(在DISTINCT查询的输出中包含4 - NULL )。

原因很简单:query.count目的是返回在没有count子句的情况下运行时查询返回的行数。此方法无法控制应使用哪些列进行计数 - 这就是func.count(...)的用途。

答案 1 :(得分:1)

MySQL COUNT不计算NULL值,因此如果您通过具有NULL值的字段计算值,则不会按COUNT计算这些行。

DISTINCT只返回不同值的数量,因此包含NULL。