Считать с условием 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, независимо от того, существует ли какой-либо комментарий, соответствующий этой новости, или нет.
Любая помощь будет очень ценной.
Ответы
Ответ 1
Используйте 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
Ответ 2
Лучше все еще (или короче):
SUM(ccc_news_comments.id = 'approved')
Это работает, так как булевский тип в MySQL представлен как INT
0
и 1
, как и в C. (Возможно, он не переносится через системы БД.)
Что касается COALESCE()
, как упоминалось в других ответах, многие API-интерфейсы языков автоматически преобразуют NULL
в ''
при извлечении значения. Например, с интерфейсом PHP mysqli
было бы безопасно запускать ваш запрос без COALESCE()
.
Ответ 3
Это должно работать:
count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, NULL))
count()
проверить только, существует ли значение. 0 эквивалентно существующему значению, поэтому он подсчитывает еще один, а NULL - как несуществующее значение, поэтому не учитывается.
Ответ 4
Заменить эту строку:
count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, 0)) AS comments
С помощью этого:
coalesce(sum(ccc_news_comments.id = 'approved'), 0) comments