Посчитайте с условием if в запросе mysql - PullRequest
92 голосов
/ 21 марта 2012

У меня есть две таблицы, одна для новостей, другая для комментариев, и я хочу получить количество комментариев, статус которых был подтвержден.

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 ]

232 голосов
/ 21 марта 2012

используйте 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 
54 голосов
/ 22 января 2013

Еще лучше (или в любом случае короче):

SUM(ccc_news_comments.id = 'approved')

Это работает, поскольку логический тип в MySQL представлен как INT 0 и 1, как в C. (Может неоднако, переносим между системами БД.)

Что касается COALESCE(), как упоминалось в других ответах, многие языковые API автоматически преобразуют NULL в '' при получении значения.Например, с интерфейсом PHP mysqli было бы безопасно выполнить ваш запрос без COALESCE().

18 голосов
/ 26 октября 2012

Это должно работать:

count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, NULL))

count() только проверяйте, существует ли значение или нет. Значение 0 эквивалентно существующему значению, поэтому оно учитывает еще одно, а значение NULL похоже на несуществующее значение, поэтому не учитывается.

1 голос
/ 21 марта 2012

Заменить эту строку:

count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, 0)) AS comments

С этим:

coalesce(sum(ccc_news_comments.id = 'approved'), 0) comments
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...