Mysql 在控制流函数中使用聚合

Mysql 在控制流函数中使用聚合,mysql,controls,aggregate,flow,Mysql,Controls,Aggregate,Flow,问题在于:创建一个查询,该查询将对IP地址进行分组,并显示返回代码(retcode)大于300顺序的每个IP地址的请求数总和。此查询由retcode字段按降序进行 我想到的是这个(经过几个小时的努力) 当然,这并不能回答问题,我只是没有办法了 是否有任何方法可以在IF或CASE语句中使用聚合函数,例如: IF(retcode > 300, SUM retcode, 0) 我认为如果我知道如何在查询中正确地编写它,这会起作用。实际上,这个问题没有意义。可以根据IP地址分组和计数,如下查询所

问题在于:创建一个查询,该查询将对IP地址进行分组,并显示返回代码(
retcode
)大于300顺序的每个IP地址的请求数总和。此查询由
retcode
字段按降序进行

我想到的是这个(经过几个小时的努力)

当然,这并不能回答问题,我只是没有办法了

是否有任何方法可以在IF或CASE语句中使用聚合函数,例如:

IF(retcode > 300, SUM retcode, 0)

我认为如果我知道如何在查询中正确地编写它,这会起作用。

实际上,这个问题没有意义。可以根据IP地址分组和计数,如下查询所示:

SELECT   ipno, COUNT(*)
FROM     Weblog
WHERE    retcode > 300
GROUP BY ipno
但是,假设有两个来自特定IP的请求,但返回代码不同(例如350和400);上面的查询将显示该地址的计数为2,但当(现在结果已分组)该IP地址现在没有单一的此类代码时,按返回代码对结果进行排序意味着什么

MySQL是一个例外,它允许您访问“隐藏”列(如上面查询中的
retcode
),而无需包含在聚合函数中;其他RDBMS会对您在问题中给出的查询产生错误。但是,出于性能原因,MySQL在每个组中为隐藏列选择一个不确定的值,因此除非它们都是相同的,否则不应依赖结果

也许您想在
ipno
retcode
上分组:

SELECT   ipno, retcode, COUNT(*)
FROM     Weblog
WHERE    retcode > 300
GROUP BY ipno, retcode
ORDER BY retcode DESC
SELECT   ipno, retcode, COUNT(*)
FROM     Weblog
WHERE    retcode > 300
GROUP BY ipno, retcode
ORDER BY retcode DESC