MySQL – заполнить отсутствующие даты

У меня есть этот запрос, и я хочу заполнить отсутствующие даты некоторыми значениями (ноль, например …)

SELECT date, SUM(val1) as sum_val FROM table1 WHERE date BETWEEN '2016-03-04' AND '2016-03-10' GROUP BY date 

Вот результат:

 |-------------------------- |date, sum_val |-------------------------- |2016-03-04, 21568 |-------------------------- |2016-03-05, 14789 |-------------------------- |2016-03-08, 20568 |-------------------------- |2016-03-10, 5841 |-------------------------- 

Как я могу заполнить отсутствующие даты нулевыми значениями? У кого-нибудь есть идея?

Мне нужны эти данные для предварительного просмотра диаграммы .

Related of "MySQL – заполнить отсутствующие даты"

В общем, вы можете сгенерировать серию из N целых чисел в MySQL, используя:

  select (@i:=@i+1)-1 as `myval` from someTable,(SELECT @i:=0) gen_sub limit N 

Обратите внимание, что таблица, к которой вы присоединяетесь (someTable), должна иметь не менее N строк. -1, чтобы сделать его базовым-ноль … удалите его, и вы получите 1,2,3 для N = 3.

Вы можете подавать эти целые числа в функцию DATE_ADD, чтобы превратить ее в ряд дат. Чтобы было проще следовать, давайте использовать некоторые пользовательские переменные для дат.

 SET @date_min = '2016-03-04'; SET @date_max = '2016-03-10'; select DATE_ADD(@date_min, INTERVAL (@i:=@i+1)-1 DAY) as `date` from information_schema.columns,(SELECT @i:=0) gen_sub where DATE_ADD(@date_min,INTERVAL @i DAY) BETWEEN @date_min AND @date_max 

Это будет возвращать строки для этих дней и каждый день между ними. Теперь это просто вопрос присоединения к вашей таблице … Я не пробовал, так как у меня нет вашей структуры db, но что-то вроде следующего должно работать:

 SET @date_min = '2016-03-04'; SET @date_max = '2016-03-10'; SELECT date_generator.date, ifnull(SUM(val1),0) as sum_val from ( select DATE_ADD(@date_min, INTERVAL (@i:=@i+1)-1 DAY) as `date` from information_schema.columns,(SELECT @i:=0) gen_sub where DATE_ADD(@date_min,INTERVAL @i DAY) BETWEEN @date_min AND @date_max ) date_generator left join table1 on table1.date = date_generator.date GROUP BY date; 

Вы можете попробовать этот цикл PHP:

 $date1 = Your_first_date_value; $date2 = Your_limit_date; for ($d1 = $date1; d1<=$date2; strtotime("+1 day", strtotime($d1))) { //Fill in values } 

strtotime("+1 day", strtotime($date1)) увеличит на 1 день текущее значение $date1 до $date1 пор, пока оно не будет равно $date2 .

Если дата не имеет значения, она будет равна нулю, и если дата существует, она получит сумму в соответствии с результатом MySQL.

Используйте ниже код, похожий на ваш запрос, и, безусловно, работайте и помогаете вам.

 $query = "SELECT date, SUM(val1) as sum_val FROM table1 WHERE date BETWEEN '2016-03-04' AND '2016-03-10' GROUP BY date"; $result = mysql_db_query($db,$query); $dateArray = Array(); foreach($result as $row) { $dateArray[] = strtotime($row['date']); } $from = "1-4-2016"; $to = "30-4-2016"; $datediff = strtotime($from) - strtotime($to); $days = floor($datediff/(60*60*24)); for ($d1 = 1; $d1<$days; $d1++) { $cdate = strtotime("+".$d1." day", strtotime($from)); if(!in_array($cdate, $dateArray)) { // Insert record with zero } }