我正在尝试获取最后一个匹配 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/