2013-12-13 3 views
0

У меня есть запрос, который подсчитывает все идентификационные номера работ по месяцам и годам, а затем создает диаграмму за последние 13 месяцев с использованием jpgraph. Он отлично работает, за исключением того, что в июле нет идентификационных номеров для работы, поэтому график полностью пропускает июль.Query возвращает null вместо 0

Запрос Результаты:

5 
16 
15 
11 
3 
12 
4 
8 
2 
9 
13 
12 

Желательные Результаты:

5 
16 
15 
11 
3 
12 
0 
4 
8 
2 
9 
13 
12 

Как вы можете видеть, что я нужен (0) ноль, чтобы на мой график работы, однако, так как нет работы ID Номер в июле мой запрос просто пропускает его. Вот мой запрос:

SELECT COUNT(WORK_ID_NUM) AS count, 
DATE FROM SERVICE_JOBS 
WHERE (DATE BETWEEN '$lastyear' AND '$date') 
AND JOB_TYPE LIKE 'Street Light' 
GROUP BY YEAR(DATE), MONTH(DATE) 
ORDER BY DATE 
+1

Так вы пытаетесь выбрать данные, которые на самом деле не существует, и вы хотите быть в результаты :) Вы должны сначала создать эти данные, а затем покинул присоединиться Это. Проверьте этот вопрос (http://stackoverflow.com/questions/10034668/how-to-generate-data-in-mysql) –

+0

В качестве примечания стороны учтите, что не возвращать результат очень сильно отличается от возвращаемого ' null', как вы указали в своем вопросе –

+0

http://stackoverflow.com/questions/273623/mysql-select-from-a-list-of-numbers-those-without-a-counterpart-in-the-id-fiel – PasteBT

ответ

0

sqlFiddle Demo

SELECT IFNULL(count,0) as count,theDate as Date 
FROM 
     (SELECT @month := @month+INTERVAL 1 MONTH as theDate 
     FROM service_jobs,(SELECT @month:='$lastyear' - INTERVAL 1 MONTH)as T1 
     LIMIT 13)as T2 
LEFT JOIN 
     (SELECT COUNT(WORK_ID_NUM)as count,DATE 
     FROM service_jobs 
     WHERE (DATE BETWEEN '$lastyear' AND '$date') 
     AND JOB_TYPE LIKE 'Street Light' 
     GROUP BY YEAR(DATE), MONTH(DATE)) T3 
ON (YEAR(theDate) = YEAR(DATE) AND MONTH(theDate) = MONTH(DATE)) 
ORDER BY theDate; 
+0

Это сработало! Бесконечно благодарен! – user3100370

+0

он работает, но это взлом (при условии, что у вас всегда есть более 13 строк данных в service_jobs) –

+1

Я в порядке с взломом! Оно работает! И да, всегда будет намного больше, чем 13! Еще раз спасибо! – user3100370

0

Чтобы получить ваш запрос, чтобы вернуть строку в июле, вам нужно иметь строку с июлем в ней. Вы можете создать таблицу со всеми датами между $ lastyear и $ date в ней, а затем внешним соединением от нее до SERVICE_JOB.

SELECT COUNT(WORK_ID_NUM) AS count, 
     allDates.DATE 
FROM AllDates 
Left outer join SERVICE_JOB 
on AllDates.DATE = SERVICE_JOB.DATE 
WHERE (AllDates.DATE BETWEEN '$lastyear' AND '$date') AND 
(SERVICE_JOB.WORK_ID_NUM is NULL OR JOB_TYPE LIKE 'Street Light') 
GROUP BY YEAR(AllDates.DATE), MONTH(AllDates.DATE) 
ORDER BY AllDates.DATE 

В SQL Server это будет довольно легко сделать Common Table Expression, которые могли бы заполнить AllDates для Вас, основываясь на $ Lastyear и $ дате. Не уверен в MySql.

+0

Я сделал это и результаты в 0 строках ... Я создал таблицу AllDates следующим образом: ID | DATE, а затем у меня есть целое число как ID и 2012-12-01 - 2014-01-01 в качестве диапазона дат. Что я сделал не так? Благодаря! – user3100370

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