Подсчет с условием if в запросе mysql
У меня есть две таблицы, одна для новостей и для комментариев, и я хочу получить количество за комментарии, статус которых был установлен как утвержден.
SELECT ccc_news . * ,
count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, 0)) AS comments
FROM ccc_news
LEFT JOIN ccc_news_comments ON ccc_news_comments.news_id = ccc_news.news_id
WHERE `ccc_news`.`category` = 'news_layer2'
AND `ccc_news`.`status` = 'Active'
GROUP BY ccc_news.news_id
ORDER BY ccc_news.set_order ASC
LIMIT 20
но проблема с этим запросом заключается в том, что минимальное значение, которое извлекается для столбца комментариев, равно 1 независимо от того, существует ли комментарий, соответствующий этой новости или нет.
любая помощь была бы весьма заметна.
4 ответов
использовать sum()
на месте count()
попробуйте ниже:
SELECT ccc_news . * ,
SUM(if(ccc_news_comments.id = 'approved', 1, 0)) AS comments
FROM ccc_news
LEFT JOIN ccc_news_comments ON ccc_news_comments.news_id = ccc_news.news_id
WHERE `ccc_news`.`category` = 'news_layer2'
AND `ccc_news`.`status` = 'Active'
GROUP BY ccc_news.news_id
ORDER BY ccc_news.set_order ASC
LIMIT 20
еще лучше (или короче в любом случае):
SUM(ccc_news_comments.id = 'approved')
это работает, так как логический тип в MySQL представлен как INT
0
и 1
, как и в C. (Не может быть переносимым через системы БД, хотя.)
по состоянию на COALESCE()
как упоминалось в других ответах, многие языковые API автоматически преобразуют NULL
to ''
при получении значения. Например, с PHP mysqli
интерфейс было бы безопасно запускать ваш запрос без COALESCE()
.
Это должно работать:
count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, NULL))
count()
только проверьте, существует ли значение или нет. 0 эквивалентно существующему значению, поэтому он подсчитывает еще одно, в то время как NULL похож на несуществующее значение, поэтому не подсчитывается.
замените эту строку:
count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, 0)) AS comments
С этим:
coalesce(sum(ccc_news_comments.id = 'approved'), 0) comments