Получение статистических данных mysql с использованием регулярных интервалов PHP и включая нулевые данные - PullRequest
2 голосов
/ 24 ноября 2011

Итак, я пытаюсь создать несколько хороших статистических дисплеев для моего приложения. Я могу сделать это, потому что я храню статистику попаданий в таблице. Он просто отслеживает хиты плюс некоторые другие приятные данные и время, когда это происходит. Я могу запросить базу данных, чтобы показать мне, сколько обращений произошло в определенный день или в каждый день за последние x дней, как показано в коде ниже. Однако приведенный ниже код возвращает только даты, для которых имеются данные. Я хотел бы показать последние 30 дней обращений, независимо от того, был ли у дня удар или нет. Мысли?

SELECT DATE(time) AS theday, COUNT( * ) AS thecount
FROM stats
WHERE time <= curdate( )
AND time >= DATE_SUB( curdate(), INTERVAL 30 DAY )
GROUP BY theday ORDER BY time DESC

Производит

theday  thecount
2011-11-22  5
2011-11-21  9
2011-11-18  10
2011-11-16  1
2011-11-11  2
2011-11-10  15
2011-11-09  2
2011-10-26  1
2011-10-24  6

Как видите, даты пропускаются без результатов. Я понимаю, почему это так, поскольку в БД нет строк с этими датами. Мне интересно, как бы я создал запрос, который работает почти так же, как указано выше, но имеет все даты для указанного интервала. IE: последние 30 дней.

1 Ответ

2 голосов
/ 24 ноября 2011

У вас есть 3 варианта:

  • попытаться перебрать даты в логике приложения (php)
  • создать (временную) таблицу, заполненную нужными вам датами, и оставить соединениес ним
  • используйте решение хранимой процедуры mysql, например в этом ответе

Пример реализации логики приложения:

<?php

    date_default_timezone_set('Europe/Paris');

    $startdate = strtotime('2011-11-01 00:00:01');
    $days = 60;

    $found_data = array( // this is generated by 1 mysql query
        array('date_field' => '2011-11-02', 'count' => 5),
        array('date_field' => '2011-11-03', 'count' => 1),
        array('date_field' => '2011-11-04', 'count' => 6),
        array('date_field' => '2011-11-08', 'count' => 9),
        array('date_field' => '2011-11-09', 'count' => 3),
        array('date_field' => '2011-11-10', 'count' => 5),
        array('date_field' => '2011-11-12', 'count' => 1),
        array('date_field' => '2011-11-15', 'count' => 1),
        array('date_field' => '2011-11-18', 'count' => 4),
        array('date_field' => '2011-11-21', 'count' => 9),
        array('date_field' => '2011-11-23', 'count' => 1),
        array('date_field' => '2011-11-28', 'count' => 8),
        array('date_field' => '2011-11-30', 'count' => 6),
    );

    foreach ($found_data as $counts) { // we convert the results to a usable form, you can do this in the query, too
        $count_info[$counts['date_field']] = $counts['count'];
    }

    for ($i = 0; $i <= $days; $i++) {
        $date = date('Y-m-d', $startdate+$i*60*60*24);
        printf("%s\t%s\n", $date, array_key_exists($date, $count_info) ? $count_info[$date] : 0);
    }

?>
...