Как правильно составить SQL-запрос с SUM информации из нескольких таблиц?

Рейтинг: 0Ответов: 1Опубликовано: 14.09.2014

Есть три таблицы. В одной хранится информация о пользователях, в двух других - рейтинги топиков и комментов. Нужно вывести топ 10 пользователей с наибольшей суммой рейтинга за комменты и посты за прошедную неделю. Пробую так:

SELECT user.user_id, SUM(topic.topic_rating + comment.comment_rating) as sum FROM tb_user as user
JOIN tb_topic as topic ON user.user_id = topic.user_id AND topic.topic_date_add > NOW() - INTERVAL 7 DAY
JOIN tb_comment as comment ON user.user_id = comment.user_id AND comment.comment_date > NOW() - INTERVAL 7 DAY
GROUP BY user.user_id LIMIT 10

Но в итоге получается просто неоправданно гиганская сумма (от нескольких тысяч). Если убрать один JOIN, сумма получается правдивой. Я так понимаю, что проблема в слишком частых повторениях из-за второго JOIN'a. Можно ли как-нибудь составить запрос таким образом, чтобы обойтись одним SELECT'ом, и получить истинное значение суммы?

Ответы

▲ 1Принят

Попробуйте так:

select q.user_id, sum(q.`sum`) as `sum` 
from (
  SELECT user.user_id, SUM(topic.topic_rating) as `sum` 
  FROM tb_user as user
    JOIN tb_topic as topic ON 
      user.user_id = topic.user_id 
      AND topic.topic_date_add > NOW() - INTERVAL 7 DAY
  GROUP BY user.user_id 
  union all
  SELECT user.user_id, SUM(comment.comment_rating) 
  FROM tb_user as user
    JOIN tb_comment as comment ON 
      user.user_id = comment.user_id 
      AND comment.comment_date > NOW() - INTERVAL 7 DAY
  GROUP BY user.user_id 
) q
group by q.user_id
LIMIT 10

Отдельно сначала получаем по топикам, потом по комментариям, потом их суммируем.

ЗЫ. Не проверял, могут быть синтаксические ошибки.
ЗЗЫ. По вкусу можно добавить сортировку и limit во внутреннем запросе...