2014-11-26 4 views
0

Я пытаюсь сгенерировать запрос, который возвращает результаты по часам и который также показывает нулевые результаты.MYSQL Group by Hour - показывает нулевые результаты

В настоящий момент инструкция MYSQL показывает только результаты, в которых существуют результаты, а не существующие результаты и нулевые результаты.

MYSQL ПОКА

SELECT DATE(received) as Date, 
CONCAT(HOUR(received), ':00-', HOUR(received)+1, ':00') AS Hours, 
IFNULL(COUNT(*), 0) as Leads from digital_lead 
where `received` BETWEEN '2014-11-01' AND '2014-11-25' 
GROUP BY DATE(received), HOUR(received) 

В настоящее время это показывает каждый день в пределах диапазона дат, деленной на часов, только там, где существует lead для этого часового интервала. Я хотел бы показать все часы в течение каждого дня, даже если нет данных lead для этого часа.

Пример

DATE   HOUR SLOT   LEADS 
2014-11-01 00:00 - 01:00  0 
      01:00 - 02:00  0 
      02:00 - 03:00  12 ... etc 

Я имел взгляд вокруг на Stackoverflow и нашел этот вопрос, который, кажется, похож

LINK

Из того, что я понимаю, что нужно создать отдельную таблицу с 24-часовыми слотами и ПРИСОЕДИНЯЙТЕ, что по моему запросу, чтобы показать IFNULL(COUNT(*),0), результат по моему запросу.

Может кто-нибудь, пожалуйста, продемонстрировать, как это будет работать на практике?

UPDATE

Используя предложения Клубничный, в ниже вот что у меня сейчас:

SELECT CONCAT(CURDATE(),' 00:00:00') + INTERVAL i2.i*10+i1.i HOUR today 
     , COUNT(received) total 
    FROM ints i1 
    CROSS 
    JOIN ints i2 
    LEFT 
    JOIN digital_lead 
    ON DATE_FORMAT(received,'%Y-%m-%d %h:00:00') = CONCAT(CURDATE(),' 00:00:00') + INTERVAL i2.i*10+i1.i HOUR 
    WHERE received BETWEEN '2014-11-01 00:00:00' AND '2014-11-26 00:00:00' 
    GROUP 
    BY HOUR(received) 

Однако это не показывает никаких результатов, где я знаю, что есть какая-то ...?

+0

(В MySQL) Вы не можете «выбрать» данные, которые не присутствуют. Вы должны каким-то образом имитировать его - либо с помощью таблицы утилиты, либо с помощью UNION select, или, я полагаю, sproc, но проблемы с представлением данных обычно лучше всего оставить на уровне кода приложения. – Strawberry

+0

@Strawberry - Итак, 'CONCAT (HOUR (полученный), ': 00-', HOUR (получено) +1, ': 00') AS Hours,' будет только выбирать часы, присутствующие в поле TIMESTAMP, а не все 24 часа? – aphextwix

+0

Ну, да (дайте или возьмите час) – Strawberry

ответ

0

Это не обязательно решение, которое я бы адвокат, но вы просили, чтобы увидеть пример вдоль этих линий ...

У меня есть таблица целых чисел (0-9). Я могу присоединиться, что в строку, чтобы сделать список, как так ...

SELECT CONCAT(CURDATE(),' 00:00:00') + INTERVAL i HOUR today FROM ints; 
+---------------------+ 
| today    | 
+---------------------+ 
| 2014-11-26 00:00:00 | 
| 2014-11-26 01:00:00 | 
| 2014-11-26 02:00:00 | 
| 2014-11-26 03:00:00 | 
| 2014-11-26 04:00:00 | 
| 2014-11-26 05:00:00 | 
| 2014-11-26 06:00:00 | 
| 2014-11-26 07:00:00 | 
| 2014-11-26 08:00:00 | 
| 2014-11-26 09:00:00 | 
+---------------------+ 

Если я хочу больше, чем 10 пунктов в моем списке, я могу только присоединиться целые числа несколько раз, вот так ...

SELECT CONCAT(CURDATE(),' 00:00:00') + INTERVAL i2.i*10+i1.i HOUR today FROM ints i1,ints i2 HAVING DATE(today) = DATE(CURDATE()); 
+---------------------+ 
| today    | 
+---------------------+ 
| 2014-11-26 00:00:00 | 
| 2014-11-26 01:00:00 | 
| 2014-11-26 02:00:00 | 
| 2014-11-26 03:00:00 | 
| 2014-11-26 04:00:00 | 
| 2014-11-26 05:00:00 | 
| 2014-11-26 06:00:00 | 
| 2014-11-26 07:00:00 | 
| 2014-11-26 08:00:00 | 
| 2014-11-26 09:00:00 | 
| 2014-11-26 10:00:00 | 
| 2014-11-26 11:00:00 | 
| 2014-11-26 12:00:00 | 
| 2014-11-26 13:00:00 | 
| 2014-11-26 14:00:00 | 
| 2014-11-26 15:00:00 | 
| 2014-11-26 16:00:00 | 
| 2014-11-26 17:00:00 | 
| 2014-11-26 18:00:00 | 
| 2014-11-26 19:00:00 | 
| 2014-11-26 20:00:00 | 
| 2014-11-26 21:00:00 | 
| 2014-11-26 22:00:00 | 
| 2014-11-26 23:00:00 | 
+---------------------+ 

Если вам не нравится, накладные расходы на поддержание полезности таблицы (некоторые люди, похоже, не - странно), вы также можете substutute утилиты таблицы со списком, который вы создаете на лета - SELECT 0 UNION SELECT 1 UNION SELECT 2 и т.д.

Теперь вы просто ВНЕШНЕЕ ОБЪЕДИНЯТЬ исходные данные, что-то вроде этого ...

SELECT * FROM my_table; 
+---------------------+ 
| dt     | 
+---------------------+ 
| 2014-11-26 03:15:35 | 
| 2014-11-26 03:17:32 | 
| 2014-11-26 04:19:01 | 
| 2014-11-26 09:44:11 | 
| 2014-11-26 09:54:00 | 
| 2014-11-26 09:59:30 | 
| 2014-11-26 12:07:24 | 
| 2014-11-26 12:07:26 | 
| 2014-11-26 13:01:15 | 
| 2014-11-26 17:00:00 | 
+---------------------+ 


    SELECT CONCAT(CURDATE(),' 00:00:00') + INTERVAL i2.i*10+i1.i HOUR today 
     , COUNT(dt) total 
    FROM ints i1 
    CROSS 
    JOIN ints i2 
    LEFT 
    JOIN my_table x 
     ON DATE(dt) = DATE(CONCAT(CURDATE(),' 00:00:00') + INTERVAL i2.i*10+i1.i HOUR) 
    AND HOUR(dt) = HOUR(CONCAT(CURDATE(),' 00:00:00') + INTERVAL i2.i*10+i1.i HOUR) 
    WHERE DATE(CONCAT(CURDATE(),' 00:00:00') + INTERVAL i2.i*10+i1.i HOUR) = CURDATE() 
    GROUP 
     BY CONCAT(CURDATE(),' 00:00:00') + INTERVAL i2.i*10+i1.i HOUR; 
+---------------------+-------+ 
| today    | total | 
+---------------------+-------+ 
| 2014-11-26 00:00:00 |  0 | 
| 2014-11-26 01:00:00 |  0 | 
| 2014-11-26 02:00:00 |  0 | 
| 2014-11-26 03:00:00 |  2 | 
| 2014-11-26 04:00:00 |  1 | 
| 2014-11-26 05:00:00 |  0 | 
| 2014-11-26 06:00:00 |  0 | 
| 2014-11-26 07:00:00 |  0 | 
| 2014-11-26 08:00:00 |  0 | 
| 2014-11-26 09:00:00 |  3 | 
| 2014-11-26 10:00:00 |  0 | 
| 2014-11-26 11:00:00 |  0 | 
| 2014-11-26 12:00:00 |  2 | 
| 2014-11-26 13:00:00 |  1 | 
| 2014-11-26 14:00:00 |  0 | 
| 2014-11-26 15:00:00 |  0 | 
| 2014-11-26 16:00:00 |  0 | 
| 2014-11-26 17:00:00 |  1 | 
| 2014-11-26 18:00:00 |  0 | 
| 2014-11-26 19:00:00 |  0 | 
| 2014-11-26 20:00:00 |  0 | 
| 2014-11-26 21:00:00 |  0 | 
| 2014-11-26 22:00:00 |  0 | 
| 2014-11-26 23:00:00 |  0 | 
+---------------------+-------+ 

Помните, я сказал, что не обязательно выступаю как решение ;-)

+0

Спасибо. Так, если бы я создал утилиту, как указано выше, я бы выбрал данные из этих данных и ПРИСОЕДИНИТЬ мой запрос к этому? – aphextwix

+0

Да. Это просто означает добавление OUTER JOIN к вышеперечисленному. – Strawberry

+0

Извините - не могли бы вы отредактировать свой ответ, чтобы показать объединенный результат моего первоначального запроса с помощью OUTER JOIN таблицы ints. У меня возникли проблемы с окончательным решением ... – aphextwix

Смежные вопросы