2012-03-19 81 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