Агрегирующая функция 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 нужен только в случае, если есть статьи без авторов (или с несуществующими авторами).