2015-09-14 4 views
0

Я пытаюсь построить график месяца с использованием запроса MySQL. Я проверяю количество строк в таблице за каждый месяц в одном запросе с помощью команды UNION. Пример 3 месяца сильфонных:Mysql IFNULL работает только один раз в несколько запросов SELECT

$query = 
"SELECT IFNULL((SELECT SUM(score) FROM statistics WHERE MONTH(date) = 1), 0) AS total UNION 
SELECT IFNULL((SELECT SUM(score) FROM statistics WHERE MONTH(date) = 2), 0) AS total UNION 
SELECT IFNULL((SELECT SUM(score) FROM statistics WHERE MONTH(date) = 3), 0) AS total"; 

$stats_query = mysqli_query ($db_connection, $query); 

    $result = ""; 
    while ($row = mysqli_fetch_assoc($stats_query)) { 
    $result .= $row['total'].","; 
    } 
    echo ($result); 

// OUTPUT: 0,176,68, 

Как вы можете видеть, я говорю MySQL, чтобы вернуть мне «0» в случае, если нет строки для этого месяца (что в случае января).

В этом запросе всего 12 SELECTS (я копировал только 3, чтобы сэкономить место), по одному на каждый месяц. Некоторые месяцы возвратят значение, другие - нет (что IFNULL должно затем преобразовать в «0»). Мой окончательный вывод, для всех 12 месяцев, должен выглядеть следующим образом:

// OUTPUT: 0,176,68,0,0,0,0,0,12,15,176,43, 

НО ... если есть больше чем один SELECT, который не возвращает ни одной строки, то запрос не будет добавить еще один «0» в результат. Мой конечный результат заканчивает тем, как это:

// OUTPUT: 0,176,68,12,15,176,43, 

Это как IFNULL исполняется только один раз, несмотря на то, что он присутствует во всех 12 ВЫБИРАЕТ ...

Я делаю что-то не так? Может ли кто-нибудь обнаружить ошибку в моем коде или что-то еще?

Спасибо!

+0

'UNION ALL',' UNION' дает результат 'DISTINCT' – lad2025

ответ

3

Использование UNION ALL вместо UNION, чтобы получить все результаты:

SELECT IFNULL((SELECT SUM(score) FROM statistics WHERE MONTH(date) = 1), 0) AS total UNION ALL 
SELECT IFNULL((SELECT SUM(score) FROM statistics WHERE MONTH(date) = 2), 0) AS total UNION ALL 
SELECT IFNULL((SELECT SUM(score) FROM statistics WHERE MONTH(date) = 3), 0) AS total 

UNION возвращает только DISTINCT строк.

От doc:

поведение по умолчанию для UNION является то, что повторяющиеся строки удаляются из результата.

+1

О, очень просто ... Я не знал, что UNION вернет мне только отдельные строки. UNION ALL решила мою проблему мгновенно. Спасибо. – DanielFox

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