在控制流函数内部使用聚合

时间:2013-05-05 17:23:43

标签: mysql controls aggregate flow

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

我想出的是(经过几个小时的挣扎)

SELECT ipno, retcode, IF(retcode > 300, 1, 0) AS 'return'
FROM WebLog 
GROUP BY ipno
HAVING SUM(retcode) > 300
ORDER BY retcode DESC

当然它没有回答这个问题,我只是用完了解决方案。

有没有办法在IF或CASE语句中使用聚合函数,例如:

IF(retcode > 300, SUM retcode, 0)

我认为如果我知道如何在查询中正确地写它,这将有效。

1 个答案:

答案 0 :(得分:0)

实际上,这个问题没有意义。一个人可以分组和依靠IP地址,如下面的查询:

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

但是,假设来自特定IP的两个请求但具有不同的返回码(比如350和400);上面的查询将显示该地址的两个计数,但是当(现在结果已经分组)现在没有一个这样的代码用于那个IP地址时,通过返回代码对结果进行排序是什么意思?

MySQL的特殊之处在于它允许您访问“隐藏”列(例如上述查询中的retcode)而不包含在聚合函数中;其他RDBMS会因您在问题中提供的查询引发错误。但是,出于性能原因,MySQL会在隐藏列的每个组中选择一个不确定的值,所以除非它们都是相同的,否则不应该依赖于结果。

也许您想要对ipno retcode进行分组:

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