mysql - DATE_SUB() 和 MIN() 问题

标签 mysql date

我正在尝试获取最后一个匹配 property_id 前 10 天的所有行。

下面的查询是我提出的,但是 HAVING 部分不起作用。

SELECT *

FROM tab t

WHERE t.property_id=1
GROUP BY t.property_id
HAVING t.creation_date BETWEEN DATE_SUB(MIN(t.creation_date), INTERVAL 10 DAY) AND MIN(t.creation_date)

ORDER BY t.creation_date DESC 

它返回所有与 property_id 匹配的行,而不检查日期。起初我以为 HAVING 被忽略了,但经过几次测试后,我意识到错误确实在那一行内。

正如我通过修改查询所看到的,下面的测试非常有效:

HAVING t.creation_date BETWEEN DATE_SUB('2017-05-29 00:00:00', INTERVAL 10 DAY) AND '2017-05-29 00:00:00'

这个也是:

HAVING t.creation_date BETWEEN DATE_SUB('2017-05-29 00:00:00', INTERVAL 10 DAY) AND MIN(t.creation_date)

但不是这个:

HAVING t.creation_date BETWEEN DATE_SUB(MIN(t.creation_date), INTERVAL 10 DAY) AND '2017-05-29 00:00:00'

因此作为结论,我认为使 HAVING 遇到麻烦的部分是:

DATE_SUB(MIN(t.creation_date), INTERVAL 10 DAY)
  • 那部分如何使我的 HAVING 变得无用?
  • 我不能或不应该同时使用 DATE_SUB() 和 MIN() 有什么原因吗?
  • 如果是这样,是否有办法绕过该限制?

编辑和回答

根据 scaisEdge 的回答,我做了一些修改,对我来说理想的 MySQL 代码如下:

SELECT *

    FROM table t

    INNER JOIN 
    (
        SELECT MAX(creation_date) AS early_date

            FROM table t
            WHERE t.property_id=1   

    ) AS sub

    WHERE t.property_id= 1 AND t.creation_date BETWEEN DATE_SUB(sub.early_date, INTERVAL 60 DAY) AND sub.early_date

我仍然无法理解为什么 HAVING 会如此表现,从现在开始我会更加小心地使用它。

最佳答案

这主要是一个建议

无论如何你可以试试数据是否有问题

这样。此查询不使用 having 和 use only between on pre calculated value

select * 
FROM tab t
inner join (
  select  DATE_SUB(MIN(t.creation_date), INTERVAL 10 DAY) as min_min , 
                    MIN(t.creation_date) as min_max
  FROM tab t
  WHERE t.property_id=1
) t2  on t.t.creation_date between t2.min_min and t2.min_max
WHERE t.property_id=1

关于mysql - DATE_SUB() 和 MIN() 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44246198/

相关文章:

php - 为什么我在远程服务器上运行 Zend Framework 2 应用程序时收到错误 : table doesn't exist,?

date - 雅典娜日期格式无法将字符串转换为日期格式

date - SAS:将 YEAR 和 MONTH 数据合并为单个 mm/dd/yyyy 日期,而不更改类型

php - 为网站设置MySQL数据库

mysql - 您可以从单元格中删除部分值吗?

ajax - Spring-roo REST JSON Controller 处理日期字段

MYSQL - 我如何用随机日期填充一行?

Java 当前日期减去 3 个月并从月份开始

php - Laravel 不考虑关系

php - 使用 PHP 获取并比较 MySQL 的平均值