2013-05-05 22 views
0

问题是这样的:创建一个查询,该查询将对IP地址进行分组,并显示每个IP地址具有大于300次的返回码(retcode)的请求数的总和这个查询由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) 

我想,如果我知道如何正确地写在查询这会工作。

回答

0

其实这个问题没有道理。一个能集团&计数的IP地址,如下面的查询:

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

然而,假设有从特定的IP,但不同的返回码(350说和400)两个请求;上面的查询将显示该地址的两个计数,但是当(现在结果已经被分组)时,对于该一个IP地址现在没有单个这样的代码,通过返回代码排序结果意味着什么?

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

也许你想小组ipnoretcode

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