Агрегирующая функция count дублирует максимальное значение в кортеже

Задача: вывести имя автора, название статьи, лайки статьи, дизлайки статьи.

Есть таблицы и их атрибуты:

-articles
    -id
    -user_id
    -title

-likes
    -user_id
    -content_id

-dislikes
    -user_id
    -content_id

-users
    -id
    -username

SQL запрос:

SELECT users.username, articles.title, count(likes.content_id) as like_count, count(dislike.content_id) as dislike_count FROM articles
LEFT JOIN users ON users.id = articles.user_id
LEFT JOIN likes ON likes.content_id = articles.id
LEFT JOIN dislike ON dislike.content_id = articles.id
GROUP BY likes.content_id, dislike.content_id

Ошибка: like_count и dislike_count дублируются, по максимальному значению одного из них, в кортеже.

В чем моя ошибка?


Ответы (2 шт):

Автор решения: Константин Трофимов
SELECT users.username, articles.title, count(likes.content_id) as like_count, 
count(dislike.content_id) as dislike_count 
FROM articles
LEFT JOIN users ON users.id = articles.user_id
LEFT JOIN likes ON likes.content_id = articles.id
LEFT JOIN dislike ON dislike.content_id = articles.id
GROUP BY users.username,articles.title
→ Ссылка
Автор решения: Akina

Ничего не понял из объяснений, в т.ч. в комментариях... но из чисто общих соображений

SELECT users.username, 
       articles.title, 
       likes.like_count, 
       dislikes.dislike_count 
FROM articles
JOIN users ON users.id = articles.user_id
LEFT JOIN ( SELECT content_id, COUNT(*) like_count
            FROM likes
            GROUP BY content_id ) likes ON likes.content_id = articles.id
LEFT JOIN ( SELECT content_id, COUNT(*) dislike_count 
            FROM dislikes
            GROUP BY content_id ) dislikes ON dislikes.content_id = articles.id

PS. LEFT JOIN для users нужен только в случае, если есть статьи без авторов (или с несуществующими авторами).

→ Ссылка