php - 带有 HAVING 子句的 Sql COUNT 产生错误结果

标签 php mysql sql

记录在我的mysql数据库中

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-04-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

我的查询有什么问题?

最佳答案

这是您的查询:

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 以及其他数据库的工作方式。

关于php - 带有 HAVING 子句的 Sql COUNT 产生错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43432917/

相关文章:

mysql - Sequelize端口不可更改

sql - 在 SQLite 数据库中只保留 N 个最后记录,按日期排序

python - Django:在数据库错误中获取最近插入的特定字段值:需要超过 1 个值才能解包

c# - SQL Server 2008 中的地理空间类型是什么 ADO 类型?

php - 使用 PHP 在 MySQL 中查找帐户名的最有效方法是什么

php - 如何在 Symfony Bundle 中包含自定义类?

php - 如何在Elasticsearch中具有子字段的字段上运行术语过滤器

php - 如何在php中打印多维数组

javascript - PHP 回显大量 HTML 数据需要花费大量时间

php - 如何使用 mysqli 防止 mysql 注入(inject) 1=1?