MySQL считает и отображает все даты в диапазоне - PullRequest
0 голосов
/ 19 марта 2012

У меня проблемы с запросом 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
)

вот так ..

часах без поиска пути, надеюсь, вы мне поможете, Привет

Ответы [ 2 ]

1 голос
/ 19 марта 2012

попробуйте это:

SELECT `from`, COUNT(*) TotalRows
FROM tableName
WHERE `from` <= date('$start') AND `from` >= date('$end')
GROUP BY `from`
ORDER BY `from`
0 голосов
/ 19 марта 2012

Я не уверен насчет того, что именно вы спросили

Но, похоже, вы можете использовать сумму с if / else и группировать по для достижения:

, как показано ниже:

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 ...

Дайте мне знать, если вам понадобится дополнительная помощь.

...