MySql count() возвращает 0, если записи не найдены
У меня есть набор постов на ежемесячной основе. Теперь мне нужен массив, который содержит общие записи сообщений, опубликованных в каждом месяце. Я попробовал ниже запрос MySql, его работа нормально, но я ожидал 0 (ноль) в течение нескольких месяцев, где нет записей. Здесь его не вернуть 0.
Я прочитал, что COUNT() не вернет '0', так как же этого добиться?
Я попробовал IFNULL () и COALESCE (), но все равно получил тот же результат. Пожалуйста, помогите с этим запросом. Спасибо......SELECT
count(id) as totalRec
FROM ('post')
WHERE year(date) = '2013'
AND monthname(date) IN ('January', 'February', 'March')
GROUP BY year(date)-month(date)
ORDER BY 'date' ASC
Получил Результат:
+----------+
| totalRec |
+----------+
| 7 |
| 9 |
+----------+
Ожидаемый результат (если нет сообщений за январь):
+----------+
| totalRec |
+----------+
| 0 |
| 7 |
| 9 |
+----------+
Примерные Данные:
+----+---------------------+
| id | date |
+----+---------------------+
| 24 | 2012-12-16 16:29:56 |
| 1 | 2013-02-25 14:57:09 |
| 2 | 2013-02-25 14:59:37 |
| 4 | 2013-02-25 15:12:44 |
| 5 | 2013-02-25 15:14:18 |
| 7 | 2013-02-26 11:31:31 |
| 8 | 2013-02-26 11:31:59 |
| 10 | 2013-02-26 11:34:47 |
| 14 | 2013-03-04 04:39:02 |
| 15 | 2013-03-04 05:44:44 |
| 16 | 2013-03-04 05:48:29 |
| 19 | 2013-03-07 15:22:34 |
| 20 | 2013-03-15 12:24:43 |
| 21 | 2013-03-16 16:27:43 |
| 22 | 2013-03-16 16:29:28 |
| 23 | 2013-03-16 16:29:56 |
| 11 | 2013-03-17 11:35:12 |
+----+---------------------+
5 ответов:
Нет никакой записи за месяц
January
, поэтому вы не получаете никакого результата. Одно из решений, которое работает, заключается в соединении подзапроса со списком месяцев, которые вы хотите отобразить в списке.SELECT count(b.id) as totalRec FROM ( SELECT 'January' mnth UNION ALL SELECT 'February' mnth UNION ALL SELECT 'March' mnth ) a LEFT JOIN post b ON a.mnth = DATE_FORMAT(b.date, '%M') AND year(b.date) = '2013' AND DATE_FORMAT(b.date, '%M') IN ('January', 'February', 'March') GROUP BY year(b.date)-month(b.date) ORDER BY b.date ASC
Вывод
╔══════════╗ ║ TOTALREC ║ ╠══════════╣ ║ 0 ║ ║ 7 ║ ║ 9 ║ ╚══════════╝
COALESCE
это то, что вы могли бы использовать, если у вас есть таблица дат и слева соединены против него. Он идет слева направо, чтобы вернуть первое ненулевое значение. Ваша группа действительно выглядит немного чокнутой в данный момент, я это поправил.SELECT COALESCE(count(id),0) as totalRec FROM ('post') LEFT JOIN dates ON dates.date = post.date WHERE year(date) = '2013' AND monthname(date) IN ('January', 'February', 'March') GROUP BY month(date), year(date) ORDER BY 'date' ASC
Где находится таблица дат..
DATE 2013-01-01 2013-01-02 2013-01-03 etc....
Смотрите здесь: http://easywebapps.blogspot.co.uk/2011/07/mysql-how-to-create-calendar-table.html
Вы пробовали
IFNULL()
правильный путь? Может быть, попробоватьIFNULL(Count(id), 0)
в предложенииSELECT
с join.
Если результирующий набор не имел записей в течение этого периода времени, вы не получите никаких результатов для подсчета, поэтому он не отображается.
Вам нужно будет либо присоединиться к другой таблице, содержащей все месяцы года, либо заполнить данные программно, когда будут возвращены результаты. Я не могу придумать другого способа сделать это, но, возможно, это возможно.
Также, как говорили другие, отделите группу запятой.