2017-05-29 54 views
2

我试图从最后匹配property_id前10天获取所有行。问题与DATE_SUB()和MIN()

以下查询是我想出的,但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 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' 

所以作为一个结论,我认为这部分会遇到TER值的烦恼是:

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 

我仍然有一些困难,理解为什么在这样的情况下表现得如此糟糕,从现在开始我会更加谨慎地使用它。

回答

1

这主要是一个建议

可能是你在数据中的某些问题,反正你可以试试

这样。此查询不使用具有和只用于之间的预计算值

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 
+0

不幸的是,它不工作,它得到我所有的行,没有检查t.property或BETWEEN。 – DuffautM

+0

creation_date列是什么样的数据? – scaisEdge

+0

一个时间戳列 – DuffautM