SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 27.11.2013 00:00:54

Dmitriy88
Участник
Зарегистрирован: 21.03.2013
Сообщений: 9

Добавить в результат SELECTa нули

Здравствуйте, уважаемые форумчане. На днях задумал я для своего проекта сделать страничку, на которой бы выводился график, показывающий количество реализованных заказов в день. Делаю следующую выборку:


SELECT COUNT(DAY(Date)) AS COUNT, DAYOFMONTH(Date) AS DAY, MONTHNAME(Date) AS MONTH, DATE(Date) AS DAYDATE
FROM Orders
WHERE Date BETWEEN '2013-11-01 00:00:00' AND NOW()
GROUP BY DAY WITH ROLLUP
 

Проблема в том, что я получу в результате только те дни, в которых были записаны заказы в базу, а необходимо как-то вернуть в этом запросе и те дни, когда не было никаких заказов. Например я получаю такой вот результат:

+-----------+--------+----------------+-----------------+
| COUNT | DAY  | MONTH      | DAYDATE   |
+-----------+--------+----------------+-----------------+
|     1         |    1     | November | 2013-11-01 |
|     2         |    2     | November | 2013-11-02 |
|     1         |    4     | November | 2013-11-04 |
 

А хотелось бы, чтобы была еще и запись вида
|     0 |    0 | November | 2013-11-03 |

Заранее спасибо за помощь.

Неактивен

 

#2 27.11.2013 00:06:04

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Добавить в результат SELECTa нули

Думаю, что самое простое будет создать табличку, в которой будет один столбец - даты.
Ну и делать Left Join этой "датной" таблицы с Вашей табличкой с заказами, так сможете определять наличие/отсутствие заказов исходя из того, является ли NULL'ом orders.Date.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 28.11.2013 22:15:19

Dmitriy88
Участник
Зарегистрирован: 21.03.2013
Сообщений: 9

Re: Добавить в результат SELECTa нули

Спасибо большое за подсказку. Выходит, придется хранить в базе дополнительную таблицу со всеми месяцами, а не будет ли это слишком накладно? Быть может есть какой-либо еще способ? Может будет выгодней каждый раз при запросе создавать временную таблицу?

Неактивен

 

#4 28.11.2013 22:23:28

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Добавить в результат SELECTa нули

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

Неактивен

 

#5 02.12.2013 23:21:03

Dmitriy88
Участник
Зарегистрирован: 21.03.2013
Сообщений: 9

Re: Добавить в результат SELECTa нули

Господа, подскажите, никак не получается составить запрос. Создал таблицу calendar, выглядит так:


+-----+-----------------+
| id    | date_time  |
+-----+-----------------+
|   1   | 2013-10-01 |
|   2   | 2013-10-02 |
|   3   | 2013-10-03 |
|   4   | 2013-10-04 |
|   5   | 2013-10-05 |
|   6   | 2013-10-06 |
|   7   | 2013-10-07 |
|   8   | 2013-10-08 |
|   9   | 2013-10-09 |
|  10  | 2013-10-10  |
|  11  | 2013-10-11  |
|  12  | 2013-10-12  |
и т.д, ничего особенного
 

Запрос выполняю тот же, что и выше, только дополненный:

SELECT COUNT(DAY(Date)) AS COUNT, DAYOFMONTH(Date) AS DAY, MONTHNAME(Date) AS MONTH, DATE(Date) AS DAYDATE FROM Orders as o RIGHT JOIN calendar as c ON DAYDATE=c.date_time WHERE Date BETWEEN '2013-11-01 00:00:00' AND NOW() GROUP BY MONTH, DAY WITH ROLLUP;
 
В ответ ошибка:
ERROR 1054 (42S22): Unknown column 'DAYDATE' in 'on clause'

Пробовал еще так:

SELECT COUNT(DAY(Date)) AS COUNT, DAYOFMONTH(Date) AS DAY, MONTHNAME(Date) AS MONTH, DATE(Date) AS DAYDATE FROM Orders o RIGHT JOIN calendar c ON DATE(Date)=c.date_time WHERE Date BETWEEN '2013-11-01 00:00:00' AND NOW() GROUP BY MONTH, DAY WITH ROLLUP;
 
Ошибка пропала, однако результат я получаю такой, будто объединения и нет вовсе.

Неактивен

 

#6 03.12.2013 05:55:13

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Добавить в результат SELECTa нули

Выполните ваш запрос без группировки

SELECT DAYOFMONTH(Date) AS DAY, MONTHNAME(Date) AS MONTH, DATE(Date) AS DAYDATE FROM Orders o RIGHT JOIN calendar c ON DATE(Date)=c.date_time WHERE Date BETWEEN '2013-11-01 00:00:00' AND NOW()

и внимательно посмотрите по каким полям вы проводите группировку (и по каким нужно)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson