Считать с условием 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