Вывести строки, которых нет в таблице? - PullRequest
2 голосов
/ 21 января 2010

У меня есть запрос, который суммирует строки, сгруппированные по дате. По сути, он подсчитывает, сколько заявок на членство в день, и распечатывает результаты изо дня в день. Естественно, если в день нет приложений, эта строка не отображается (например, ниже 15-го и 17-го не было приложений .....

Date         |    Applications
-----------------------------------
12/01/2010   |   44
13/01/2010   |   73
14/01/2010   |   66
16/01/2010   |   102
18/01/2010   |   12
19/01/2010   |   22

Мне нужно, чтобы распечатать дату и 0 для дней, когда нет приложений, чтобы не пропустить ни одного дня. Любая идея, как это сделать. Я думал о присоединении к столу с каждым днем ​​года, но это кажется излишним

Запрос ниже

SELECT
application_date AS Date,
COUNT(*) AS Applications 
FROM members
GROUP BY ap_date 

Ответы [ 4 ]

1 голос
/ 21 января 2010

Это очень похоже на другой вопрос по SO . Общий консенсус выглядит так:

  1. Заполните пустые даты в прикладном слое программы.
  2. Создайте временную таблицу, заполните ее датами и присоединитесь к временной таблице.

Наилучший вариант - № 1 - он наименее запутанный и должен иметь наименьшие накладные расходы.

0 голосов
/ 22 января 2010

Нет ничего лишнего в том, чтобы создать таблицу только для перечисления всех дат в году; он называется вспомогательной таблицей и может сделать этот запрос (и многое другое) очень простым.

0 голосов
/ 21 января 2010

Я бы создал массив PHP, а индексом массива была бы строка, дата, я предпочитаю этот формат ГГГГ-ММ-ДД, и я бы сделал что-то вроде этого (обратите внимание, формат даты ключа важен)

// how far in the past to go
$days_in_the_past = 365;
// default to today, unix timestamp file
$start_day = time();

// the array that contains all out dates
$dates = array();

// sec * min * hours
$secs_in_a_day = 60 * 60 * 24;

// note we're going backwards here
for ( $i=0; $i <= $days_in_the_past; $i++ )
{
    $key = date('Y-M-D', ($start_day - ($secs_in_a_day * $i)));
    // this sets the format of   2010-01-21   as the key
    $dates[$key] = "";
}

$query = 'SELECT date, app FROM table';
$result = mysql_query($query);
while ( $row = mysql_fetch_assoc($result) )
{
    $key = date('Y-M-D', strtotime($row['Date']));
    $dates[] = $row['Applications'];
}

Если вы хотите, чтобы даты были в порядке, просто отсортируйте массив.

0 голосов
/ 21 января 2010

Выберите для рассматриваемого диапазона дат. Затем переберите диапазон дат, чтобы посмотреть, соответствует ли текущая строка. Если это не так, выведите 0. Если это произойдет, выведите соответствующее число и перейдите к следующей строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...