0

所以通常你可以做

SELECT COUNT(field.id) FROM table WHERE field.id > 100

和 COUNT(field) 将返回具有 field.id > 100 标准的条目数

但是,如果您要计算使用 HAVING 标准指定的条目,例如

SELECT COUNT(field.id), field.id * 10 AS foo FROM table HAVING foo > 100

在这种情况下,代码将不起作用....

如何计算通过 HAVING 子句指定标准的条目?

提前致谢

4

3 回答 3

5

好吧,COUNTworks BEFORE HAVING应用于结果集。因此,如果您需要计算他们的数量 - 您必须将您的查询与另一个包裹起来。

SELECT COUNT(*) FROM (
    SELECT field.id * 10 AS foo FROM table HAVING foo > 100
)
于 2010-09-20T01:35:56.543 回答
2

我不能按原样运行任何一个查询 - 他们给我一个 1140 错误“使用没有 GROUP BY 子句的聚合”(IE:)COUNT(field.id)。一切似乎都与聚合无关,只是能够引用列别名进行比较......

最广泛支持的方法是:

SELECT field.id * 10 AS foo 
  FROM table 
 WHERE field.id * 10 > 100

GROUP BYMySQL 确实支持在orHAVING子句中引用列别名。它不需要使用反引号,但我见过在反引号出现之前不起作用的实例(非保留词):

SELECT field.id * 10 AS foo 
  FROM table 
HAVING `foo` > 100

我不推荐这种方法 - SQL Server 支持它,但 Oracle 不支持......

HAVING子句类似于子句,不同之WHERE处在于HAVING子句支持聚合函数,而不需要将它们包装在子查询中。

于 2010-09-20T01:33:36.673 回答
1

免责声明 - 我只在 SQL Server 上测试过这个

在这种情况下,HAVING 只会对整个返回的集合执行任何聚合查询。首先,你不能跑

SELECT COUNT(field.id), field.id * 10 AS foo FROM table HAVING foo > 100

因为 field.id 不包含在定义组或聚合函数的子句中;它只是不编译。

话虽如此,下面的 SQL -

SELECT COUNT(field.id) FROM table HAVING COUNT(field.id) > 100

如果计数大于 100,将返回表中的行数。如果不是,您将不会得到任何结果。

你有一个特定的问题吗?你想数什么?

于 2010-09-20T01:33:31.913 回答