2014-10-31 86 views
0

爲什麼以下查詢在空數據庫的MySQL 5.6中返回NO RESULT?COUNT(*)不能與羣組一起使用?

SELECT COUNT(*) 
FROM a_sec_banns 
WHERE ip = 'not-exist-ip' 
GROUP BY ip 
HAVING max(date_created) <= '10-10-2014' or count(*) > 3; 

表的結構是這樣的:

CREATE TABLE `a_sec_banns` (
    `ID` bigint(20) NOT NULL AUTO_INCREMENT, 
    `DATE_CREATED` datetime DEFAULT NULL, 
    `IP` varchar(60) NOT NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; 

我希望查詢COUNT(*)將返回一個數> 0,0,如果沒有,異常,如果查詢是錯誤的。但從不NULL - COUNT上的NULL/NO結果目的是什麼?

+0

沒有意義只通過ip過濾一個ip和group。 – 2014-10-31 09:41:07

+0

空表,沒有結果,在我看來應該如何工作?有0條記錄屬於你的'HAVING'條款('max(date_created)<= '10 -10-2014'或count(*)> 3') – Wrikken 2014-10-31 09:41:12

+1

提供一些輸入數據。 – SonalPM 2014-10-31 09:41:48

回答

3

這是查詢:

SELECT COUNT(*) 
FROM a_sec_banns 
WHERE ip = 'not-exist-ip' 
GROUP BY ip 
HAVING max(date_created) <= '10-10-2014' or count(*) > 3; 

如果運行只是一個空數據庫,在第一部分:

SELECT COUNT(*) 
FROM a_sec_banns 
WHERE ip = 'not-exist-ip' 
GROUP BY ip ; 

你會得到一個一行的0值。

但是,having子句過濾掉了這一行。 max(date_created)將是NULLcount(*)將是0,所以這兩個條件都會失敗。

順便說一下,您應該使用ISO標準日期格式。因此,having條款應改爲:

HAVING max(date_created) <= '2014-10-10' or count(*) > 3; 

當表實際上確實有數據這將幫助。

編輯: 這是計數()的範圍問題。當使用聚合數據集時,(GROUP BY ..),聚合內的計數 - 在你的情況下沒有聚合,所以沒有計數結果。當在簡單的select..where上使用count()時,它會計算整個查詢的結果,因此即使是空結果集也會被計爲0

+0

添加評論cypherabe,關閉它,並添加+1 – kulatamicuda 2014-10-31 15:36:17

0

雖然查詢的最後一部分沒有意義,這將解決您的問題:

  1. 當創建該表,有IP默認爲not-exist-ip這樣的:

    CREATE TABLE a_sec_banns (
        ID bigint(20) NOT NULL AUTO_INCREMENT, 
        DATE_CREATED datetime DEFAULT NULL, 
        IP varchar(60) NOT NULL DEFAULT NULL 'not-exist-ip', 
        PRIMARY KEY (ID) 
    ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; 
    
  2. 在您的查詢,使用數據庫日期時間像2014-10-10 00:00:00作爲比較:

    SELECT COUNT(*) 
    FROM a_sec_banns 
    WHERE ip = 'not-exist-ip' 
    GROUP BY ip 
    HAVING max(date_created) <= '2014-10-10 00:00:00' or count(*) > 3; 
    
+0

這並沒有解決問題。查詢返回不是0,但沒有結果。 – kulatamicuda 2014-10-31 10:15:35

+0

我測試了數據並且它工作。給我看你的樣本數據 – 2014-10-31 10:16:34

+0

你的樣本數據應該有'not-exist-ip'來返回結果 – 2014-10-31 10:17:38

相關問題