2012-11-19 137 views
1

我想構建一個查詢,只獲取基於日期的一組記錄上的最新記錄。Groupwise最大查詢獲取記錄的最新日期

表的佈局是以下:

| date | category | action | label | label2 | count_today | count_total | period | 

主鍵是基於列datecategoryactionlabellabel2perioddate具有格式yyyy-mm-dd和週期的值可以是DayWeekmonth

對於category | action | label | label2每個唯一組合,我需要有最近日期的記錄。

我在這第一次嘗試是這樣的:

SELECT * FROM `statistic` 
WHERE 
(action='total' OR action='' OR category='user') 
AND 
(period='day' 
    OR (period='week' AND DATEDIFF(now(), `date`) > 30) 
    OR (period = 'Month' AND DATEDIFF(now(), `date`) > 7*26) 
) 
GROUP BY category, action, label, label2 
ORDER BY date DESC 

與此查詢的問題是,它的GROUP BY ORDER BY之前,導致要返回不正確的記錄。

搜索後,我發現,我想所謂的group-wise maximum查詢。

我的下一個嘗試是這樣的:

SELECT s1.* FROM `statistic` AS s1 
LEFT JOIN statistic AS s2 
ON 
s1.category = s2.category 
AND s1.action = s2.action 
AND s1.label = s2.label 
AND s1.label2 = s2.label2 
AND s1.date > s2.date 
WHERE 
    (s1.action='total' OR s1.action='' OR s1.category='user') 
    AND 
    (s1.period='day' 
    OR (s1.period='week' AND DATEDIFF(now(), s1.`date`) > 30) 
    OR (s1.period = 'Month' AND DATEDIFF(now(), s1.`date`) > 7*26) 
) 
GROUP BY category, action, label, label2 

但此查詢不給我正確的結果是(它類似於第一個查詢)。

任何線索我如何能得到我需要的數據?

回答

4

你是正確的,你想要的group-wise maximum,但你通過與發現最新的日期爲每個組子查詢加入你的表實現這一點:

SELECT * FROM statistic NATURAL JOIN (
    SELECT category, action, label, label2, MAX(date) date 
    FROM  statistic 
    GROUP BY category, action, label, label2 
) t 

然後,如果仍需要以下過濾器:

WHERE 
(action='total' OR action='' OR category='user') 
AND 
(period='day' 
    OR (period='week' AND DATEDIFF(now(), `date`) > 30) 
    OR (period = 'Month' AND DATEDIFF(now(), `date`) > 7*26) 
) 
+0

不,我不是指的你的答案。無論如何,刪除我的,因爲你的是一個更優雅。 – fancyPants

+0

夠公平的:)但我不相信你的編輯,因爲這個問題指出:「對於'category | action | label | label2'的每個獨特組合,我需要記錄最新的日期。」(我認爲這些過濾器被OP應用於錯誤的嘗試來達到這個解決方案)。我建議至少分離出一個單獨的查詢。 – eggyal

+0

夠公平的,優雅的主人:) – fancyPants