2017-04-16 35 views
0

記錄SQL COUNT在我的MySQL數據庫HAVING子句產生錯誤的結果

id camper_id reg_date 
1 3   2017-04-17 00:00:00 
2 3   2017-04-18 00:00:00 
3 4   2017-04-15 00:00:00 
4 4   2017-04-13 00:00:00 

SELECT COUNT(*),camper_id,reg_date FROM tbl_registration GROUP BY camper_id HAVING reg_date >= CURDATE() 

可以說,今天或CURDATE是2017年4月15日00:00:00

我得到了錯誤的結果。這是我所得到的,當我運行查詢

COUNT(*) campr_id reg_date 
2   3   2017-04-15 00:00:00 
2   4   2017-04-18 00:00:00 

我應該得到..

COUNT(*) camper_id reg_date 
2   3   2017-04-15 00:00:00 
1   4   2017-04-18 00:00:00 

我的查詢出了什麼問題?

+0

如果您將「GROUP BY」部分作爲最後一部分,該怎麼辦?爲什麼不使用'WHERE'子句? – JazZ

回答

1

這是您的查詢:

SELECT COUNT(*), camper_id, reg_date 
FROM tbl_registration 
GROUP BY camper_id 
HAVING reg_date >= CURDATE(); 

HAVING是的GROUP BY後處理。但是您沒有在GROUP BY中指定reg_date。因此,你應該有一個聚合函數。

我覺得你真的想要一個WHERE條款:

SELECT COUNT(*), camper_id, MIN(reg_date) as reg_date 
FROM tbl_registration 
WHERE reg_date >= CURDATE() 
GROUP BY camper_id; 

MySQL允許你在一個聚集有這樣的「裸」欄目。但是,這是一個非常糟糕的做法。我認爲最新版本的MySQL已經改變了默認的行爲,不允許這個構造 - 更好地符合ANSI SQL和其他數據庫的工作方式。

+0

當我在PhpMyadmin中直接運行它時,您的查詢會生成所需的結果,但是當我在php代碼中使用相同的查詢時,它會生成未定義的索引:COUNT(reg_date)錯誤 – Chip

+0

謝謝您在我的結尾修改完成後正常工作。非常感謝你。 – Chip

0

請嘗試以下...

SELECT COUNT(*), 
     camper_id, 
     reg_date 
FROM tbl_registration 
WHERE DATEDIFF(reg_date, 
       CURDATE()) >= 0 
GROUP BY camper_id; 

請仔細閱讀dasblinkenlight的在SQL - having VS where答案WITHHAVING之間的差異的一個很好的討論。

如果您有任何問題或意見,請隨時發佈相應評論。

+0

代碼已更正。 – toonice

+0

我在PhpMyadmin – Chip

+0

代碼中得到意外的子句排序(靠近GROUP BY)。請再試一次。 – toonice