问题是这样的:创建一个查询,该查询将对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)
我认为如果我知道如何在查询中正确地写它,这将有效。
答案 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