2017-05-29 78 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