У меня есть следующие таблицы:
User
UserPostView
Post
UserPostView
- это таблица соединений, содержащая дополнительную информацию о том, User
проголосовал, понизил или прошел после просмотра сообщения.
Post
содержит столбец postable_type
, указывающий тип сообщения (TextPost
, ImagePost
и т. Д.).
Я хотел бы рассчитать количество голосов «за», «против» и «пройдено» для каждого пользователя, сгруппированного по postable_type
.
Мой текущий запрос очень медленный, и я уверен, что его можно легко оптимизировать.
SELECT
U.id,
count((UP.postable_type = 'text_post' AND UPV.passed = true) OR NULL) as text_posts_pass_count,
count((UP.postable_type = 'text_post' AND UPV.upvote = true) OR NULL) as text_posts_upvote_count,
count((UP.postable_type = 'text_post' AND UPV.downvote = true) OR NULL) as text_posts_downvote_count,
count((UP.postable_type = 'image_post' AND UPV.passed = true) OR NULL) as image_posts_pass_count,
count((UP.postable_type = 'image_post' AND UPV.upvote = true) OR NULL) as image_posts_upvote_count,
count((UP.postable_type = 'image_post' AND UPV.downvote = true) OR NULL) as image_posts_downvote_count
FROM
users U
INNER JOIN(
SELECT
user_id,
post_id,
passed,
upvoted,
downvoted
FROM
user_post_views
) UPV on U.id :: TEXT = UPV.user_id :: TEXT
INNER JOIN(
SELECT
id,
postable_type
FROM
posts
) UP on UPV.post_id :: TEXT = UP.id :: TEXT
GROUP BY
U.id