2013-05-05 19 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