MySQL объединение не возвращает строки при попытке подсчета из левой таблицы - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть 2 таблицы, статьи и article_comments. Попытка получить количество комментариев на странице списка статей. Тем не менее, любые статьи, в которых нет комментариев, не возвращаются моим запросом.

SELECT `articles`.*, COUNT(comments.id) AS comment_count 
FROM `articles` as `articles` 
LEFT JOIN `article_comments` as `comments` ON `articles`.`id` = `comments`.`article_id`

Как сделать так, чтобы запрос возвращал все строки из статей с comment_count как 0 если к этому посту нет комментариев?

1 Ответ

0 голосов
/ 06 апреля 2020

Очевидно, что в вашем запросе отсутствует предложение GROUP BY, которое должно перечислять все столбцы из таблицы articles - или, если вы запускаете MySQL с отключенным режимом sql ONLY_FULL_GROUP_BY, оно должно содержать первичный ключ articles.

Может быть проще express это с коррелированным подзапросом:

select 
    a.*,
    coalesce(
        (select count(*) from article_comments ac where ac.article_id = a.id),
        0
    ) comments_count
from articles a

Вы также можете предварительно агрегировать в подзапросе:

select
    a.*,
    coalesce(c.comments_count, 0) comments_count
from articles a
left join (
    select article_id, count(*) comments_count
    from article_comments
    group by article_id
) c on c.article_id = a.id
...