2017-04-16 19 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