2016-07-15 1 views
1

Как я могу сделать этот запрос, чтобы вернуть строку с 0 значением, если не существует никакого значения для каждой датыКак сделать возврат запроса 0 вместо пустого множество, если нет результата

SELECT COUNT(id) FROM `panel_messages` WHERE `sent_by` = 'root' 
     AND `send_date` IN ("1395-4-25","1395-4-24","1395-4-23","1395-4-22","1395-4-21","1395-4-20","1395-4-19") 
     GROUP BY `send_date` 
     ORDER BY `send_date` DESC 

Моего ожидаемого результата 7 рядов, как это:

| row1 | 

| row2 | 

| row3 | 

| row4 | 

| row5 | 

| row6 | 

| row7 | 

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

| 2 | 

| 0 | 

| 0 | 

| 2 | 

| 0 | 

| 3 | 

| 1 | 

Но сейчас я просто получить 4 строки, потому что если нет результата мой запрос не возвращает ничего:

| 2 | 

| 2 | 

| 3 | 

| 1 | 

SQL скрипку: http://sqlfiddle.com/#!9/a07486/3

+0

что делают вас хотите ли вы вернуть null, если count (id) равен 0? – Cherif

ответ

1

попробовать это:

SELECT sent_by ,"1395-4-25" as `SEND DATE`,COUNT(*) FROM `panel_messages` WHERE `sent_by` = 'root' AND `send_date` = "1395-4-25" 
union 
SELECT sent_by ,"1395-4-24" as `SEND DATE`,COUNT(*) FROM `panel_messages` WHERE `sent_by` = 'root' AND `send_date` = "1395-4-24" 
union 
SELECT sent_by ,"1395-4-23" as `SEND DATE`,COUNT(*) FROM `panel_messages` WHERE `sent_by` = 'root' AND `send_date` = "1395-4-23" 
ORDER BY `SEND DATE` DESC 

в этом случае, когда дата не нашел COUNT (*) возврат 0; но в первом возврате null добавьте инструкцию 4 select, и она вернет 7 строк, теперь она работает, но может быть лучше, если я найду другое решение. Я возвращаюсь сюда

+0

Я все еще получаю 4 строки. Если для одной из дат нет результата, запрос возвращает пустой набор. Например, этот запрос возвращает пустой результат, но хочет, чтобы он возвращал 0: SELECT COUNT (id) FROM 'panel_messages' WHERE' sent_by' = 'root' И 'send_date' IN (" 1395-4-25 ") GROUP BY' send_date' ORDER BY 'send_date' DESC – Armin

+0

ahh видит проблему теперь, позвольте мне подумать об этом – Cherif

+0

i editer мой ответ, это должно ответить на ваш вопрос – Cherif

1

Пожалуйста, дайте ему попробовать:

SELECT 
COALESCE(YT.total,t.total) AS cnt 
FROM 
(SELECT 0 AS total) t 
LEFT JOIN 
(
    SELECT 
     COUNT(id) AS total 
    FROM `panel_messages` 
    WHERE `sent_by` = 'root' 
    AND `send_date` IN ("1395-4-25","1395-4-24","1395-4-23","1395-4-22","1395-4-21","1395-4-20","1395-4-19") 
    GROUP BY `send_date` 
    ORDER BY `send_date` DESC 
) YT 
ON 1=1; 

Примечание:

Фиктивная строка создана со значением 0.

Позже делает LEFT JOIN между этой фиктивной таблицей и вашего query

И, наконец, с помощью COALESCE вы можете достичь количества по умолчанию 0, если ваш основной запрос не возвращает ничего.

EDIT:

Запрос:

SELECT 
COALESCE(YT.count,0) AS count 
FROM 
(
    SELECT ADDDATE('1395-01-01', INTERVAL @i:[email protected]+1 DAY) AS DAY 
    FROM (
    SELECT a.a 
    FROM (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a 
    CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b 
    CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c 
) a 
JOIN (SELECT @i := -1) r1 
) dateTable 
LEFT JOIN 

(
    SELECT 
     send_date, 
     COUNT(id) AS count 
    FROM 
     `panel_messages` 
    WHERE 
     `sent_by` = 'root' 
    AND `send_date` IN (
     "1395-4-25", 
     "1395-4-24", 
     "1395-4-23", 
     "1395-4-20" 
    ) 
    GROUP BY 
     `send_date` 
    ORDER BY 
     `send_date` DESC 
) AS YT 
ON dateTable.DAY = YT.send_date 
WHERE dateTable.DAY IN ('1395-04-25','1395-04-24','1395-04-23','1395-04-20'); 

Для того, чтобы получить нулевой отсчет для дат, которые не существуют вам необходимо создать временную таблицу, где все даты (в определенный диапазон).

Затем, делая левое соединение между полем даты этой временной таблицы и полем send_date, ваша работа будет выполнена почти.

Наконец, вам необходимо использовать COALESCE, чтобы получить 0, если count - NULL.

WORKING DEMO

+0

он работает, но он не возвращает 0, если подзапрос возвращает пустой набор (нет результата) – Armin

+0

На самом деле вам не нужно использовать 'IFNULL' на' count'. Если ваш результирующий набор пуст, вы не получите никакой строки. Вы хотите показать значение по умолчанию, когда набор результатов пуст? – 1000111

+0

yes thats what i want, и мне бы хотелось, чтобы значение по умолчанию было 0 – Armin

1

на другой ответ, что вы пытаетесь сделать, невозможно без союза:

но вы можете попробовать некоторые думают иначе создать временную таблицу, которая содержит дату

create Table temporary (
     send_date date 
    ); 
    insert INTO temporay("1395-4-25"),("1395-4-24"),("1395-4-23"),("1395-4-22"),("1395-4-21"),("1395-4-20"),("1395-4-19") 

чем сделать выбор с Rigth присоединиться между столом и этот теперь вы будете иметь запись для дата, которая не имеет send_by

panel_messages.sent_by | panel_messages.send_date | temporary.send_date 
root       "1395-4-25"    "1395-4-25" 
root       "1395-4-25"    "1395-4-25" 
null       null      "1395-4-24" 
null       null      "1395-4-23" 
root       "1395-4-19"    "1395-4-19" 
. 
. 
. 

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

Попробуйте выбрать после создания временной таблицы

SELECT temporary.send_date, count(sender_by) 
from panel_messages RIGTH JOIN temporary ON (temporary.send_date = panel_messages.send_date) 
where 
panel_messages.sent_by like 'root' 
group by temporary.send_date 
ORDER BY send_date DESC; 
+0

попробуйте это решение, я did'nt вы здесь, нет пути в mysql, чтобы создать таблицу из списка значений или создать выбор из списка значений, поэтому мы должны создать временную таблицу, чтобы вставить в нее значение, чем соединение – Cherif

+0

скажите мне, если я не работал, потому что я тестирую его, и он работает – Cherif

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