Подсчет с условием 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