2012-03-19 85 views
0

我有一個MySQL查詢的問題。我有以下表格:MySQL數量和顯示範圍內的所有日期

[id] 
[from] DATE (Y-m-d) 
[days] INT 
[...] 

和我有兩個PHP變量$start$end。我想有這樣的結果,例如:

$start = 2012-19-03 
$end = 2012-24-03 
$result = array(
[0] => COUNT of rows WHERE '2012-19-03' BETWEEN from AND from + INTERVAL days DAY 
[1] => COUNT of rows WHERE '2012-20-03' BETWEEN from AND from + INTERVAL days DAY 
[2] => COUNT of rows WHERE '2012-21-03' BETWEEN from AND from + INTERVAL days DAY 
[4] => COUNT of rows WHERE '2012-22-03' BETWEEN from AND from + INTERVAL days DAY 
[5] => COUNT of rows WHERE '2012-23-03' BETWEEN from AND from + INTERVAL days DAY 
[6] => COUNT of rows WHERE '2012-24-03' BETWEEN from AND from + INTERVAL days DAY 
} 

直到現在我與每一天的查詢這樣做在一個while循環,但應該有一個更好的辦法。我的問題是GROUP BY,那裏的數據不存在的日子。

更詳細的例子:

的樣本數據:

id, from,  days 
1, 2012-15-03, 2 
2, 2012-15-03, 5 
3, 2012-13-03, 20 
4, 2012-16-03, 1 

期望的結果:

$start = 2012-11-03 
$end = 2012-19-03 
$result = array(
[0] => 0 (ROWS IN DB WHERE '2012-11-03' BETWEEN from AND from+days -- no match in data), 
[1] => 0 (ROWS IN DB WHERE '2012-12-03' BETWEEN from AND from+days -- no match in data), 
[2] => 1 (ROWS IN DB WHERE '2012-13-03' BETWEEN from AND from+days -- id #3 matches), 
[3] => 1 (and so on), 
[4] => 3, 
[5] => 4, 
[6] => 3, 
[7] => 2 
) 

這樣的..

興小時沒有找到一種方法,我希望你能幫我, 問候

+0

所以問題出在哪裏,如果你知道之間關鍵字 – 2012-03-19 05:45:50

+0

得到這種排序陣列的PHP變量$ start和$ end – Feryaz 2012-03-19 05:49:34

+0

之間的天數你可以發佈你從數據庫中獲得的數組還有select sql查詢 – 2012-03-19 06:09:43

回答

0

我不知道你問

,但似乎你可以使用和使用的if/else和group by才達到什麼:

象下面這樣:

select sum(if('2012-19-03' BETWEEN `from` AND date_Add(`from` , INTERVAL days DAY)),1,0)) as firstdaycount, 
sum(if('2012-20-03' BETWEEN `from` AND date_Add(`from` , INTERVAL days DAY)),1,0)) as secondaycount, 
.. 
.... 
..... 
...... 
..... 
where [...] 
Group By ... 

讓我知道如果你需要進一步的幫助。

+0

這意味着我需要在一個循環中構建querie,是不是更靈活? $ start和$ end變量並不總是相同的,並且總是具有相同的天數。 – Feryaz 2012-03-19 06:13:54

+0

嘗試了@johntotetwoo解決方案。你不想要? – 2012-03-19 06:17:24

1

試試這個:

SELECT `from`, COUNT(*) TotalRows 
FROM tableName 
WHERE `from` <= date('$start') AND `from` >= date('$end') 
GROUP BY `from` 
ORDER BY `from` 
+0

我不想讓它們按順序排列,它們應該由PHP變量的日期排序。 – Feryaz 2012-03-19 06:16:12

+0

好吧,那麼你從PHP變量中得到什麼意思呢?你能進一步闡述一下嗎?謝謝.. – 2012-03-19 06:18:23

+0

如果$ start是'2012-19-03',$ end是'2012-20-03'。數組的第一個元素的值應爲「COUNT of rows WHERE'2012-19-03'BETWEEN from and from INTERVAL days DAY」,第二個「COUNT of rows WHERE'2012-20-03'BETWEEN from AND from + INTERVAL天DAY「。這意味着它在$ start和$ end之間的時間排序。 – Feryaz 2012-03-19 06:19:37

0

修訂的答案:以 「日期列表」 表應該幫助加盟。該表是一個包含日期的列表(例如2000到2050年)。填充此表應該很簡單:您可以在Excel中創建數據並將其導入到MySQL中或編寫一個(PHP)腳本。讓我們稱之爲表datelist(可以使用this query填充表):

CREATE TABLE `datelist` (
`date` DATE NOT NULL, 
PRIMARY KEY (`date`) 
); 

至於您的查詢,它只是變成了:

SELECT datelist.`date`, COUNT(table1.id) 
FROM datelist 
LEFT JOIN table1 ON datelist.`date` BETWEEN table1.`from` AND (table1.`from` + INTERVAL table1.days DAY) 
WHERE datelist.`date` BETWEEN '2012-03-19' AND '2012-03-24' 
GROUP BY datelist.`date` 
+0

對不起,但我真的不知道你的anwser可以幫助我嗎? – Feryaz 2012-03-19 06:53:58

+0

看看修訂答案是否有幫助。 – 2012-03-19 09:40:28