Я пытаюсь построить графику за месяц, используя запрос MySQL. Я проверяю, сколько строк в таблице за каждый месяц в одном запросе, с помощью команды UNION. Пример с 3 месяцами ниже:
$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 SELECTS …
Я делаю что-то неправильно? Кто-нибудь может обнаружить ошибку в моем коде или что-то?
Спасибо!
использование 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
строк.
От доктор:
Поведение по умолчанию для UNION состоит в том, что повторяющиеся строки удаляются из
результат.
Других решений пока нет …