2012-08-10 46 views
0

我想根據表的行中的日期從我的MySQL表中獲取前N個星期的數據。基於內容中的日期獲取N個最後幾周的MySQL行

試想一下,當前周是30號,我有29周​​,28,26和12

如果我要根據今天的日期過去兩週行的數據行,這很容易,但我希望基於行上的時間戳。因此,如果N = 2,我希望從第29周和第28周開始的所有行。如果N = 3,我希望第29,28和26周,無論哪一週是我提取它的時間。

我可以使用PHP和基於估計輸出的猜測來做到這一點,但也許有一些我可以利用的MySQL功能。

+0

喜歡的東西SELECT .... WHERE時間>值1和時間<值 – thatidiotguy 2012-08-10 20:44:42

+0

使用MySQL的LIMIT選擇您需要的範圍。 – j08691 2012-08-10 20:45:09

+0

因此,您實際上需要最後N個數據(恰好在幾周內),而不是最後N個星期的數據? – 2012-08-10 20:58:05

回答

2

一種方法是使用查詢獲取想要返回的週數,然後將該查詢用作可以加入的內聯視圖。

事情是這樣的:

SELECT t.* 
    FROM (SELECT s.week FROM tab s GROUP BY s.week ORDER BY s.week DESC LIMIT 3) r 
    JOIN tab t 
    ON t.week = r.week 

內聯視圖(別名爲r)獲取表中的N個最近一週值的列表。 (假設周列是可排序的,就像它是一個整數一樣)

將它加入到表中,ON子句將從表返回的行限制爲具有星期值的那些行該匹配一個由聯視圖返回

注意:week列的索引可用於大量的行的,並在week柱高基數提供顯著性能益處

注:對於大表,可能會有性能差異例如,執行JOIN操作與使用IN (subquery)謂詞,如下例所示。對於大多數大集合以及我所做的查詢,我發現JOIN通常表現更好。但是你可能想要測試兩者,看看哪個更適合你。 (小表,它不會多大關係無論哪種方式,性能差異成爲真正的大表顯著。)

SELECT t.* 
    FROM tab t 
WHERE t.week 
    IN (SELECT s.week FROM tab s GROUP BY s.week ORDER BY s.week DESC LIMIT 3) r 
1

嘗試這樣的事情(代碼未測試):

SELECT ... FROM table WHERE week IN (
    SELECT DISTINCT week FROM table ORDER BY weeks DESC LIMIT 3 
) 

基本上,只要使用DISTINCT關鍵字,以得到實際是在數據庫中的數週的列表,然後用ORDER BY ... DESC LIMIT 3拿到三最近幾周。

我在一個子查詢中這樣做,這樣你就可以在PHP中使用它作爲一個調用,而不是調用數據庫,在PHP中解析,然後重新提交,而MySQL通常會以更快的速度執行。

相關問題