MySQL запрос, чтобы получить топ-10 баллов за последнюю неделю? - PullRequest
0 голосов
/ 21 декабря 2009

Я пытаюсь написать запрос, который возвращает идентификаторы пользователей из 10 лучших пользователей, набравших наибольшее количество очков за последние 7 дней в моем веб-приложении.

У меня есть три таблицы, которые вместе содержат необходимую мне информацию.

  1. votingapi_votes Таблица. У него есть запись для каждого «за» / «против» комментария или узла.
  2. node Таблица. Он может связать идентификатор узла с идентификатором пользователя, чтобы вы могли выяснить, кто опубликовал статью, получив голоса.
  3. comments таблица, которая делает то же самое для комментариев.

Мне кажется, мне нужно написать запрос, который выбирает каждый голос по комментарию или узлу за последнюю неделю из таблицы голосованияapi_vote.

Вот структура этой таблицы:

  • vote_id
  • content_type
  • content_id
  • значение
  • value_type
  • бирка
  • UID
  • 1035 * Отметка времени *

Таким образом, я бы ВЫБИРАЛ строки content_type "node" или "comment" с отметкой времени Unix, превышающей time () - 684000.

Тогда нужно

  1. сгруппируйте эти голоса по "content_id".

  2. Найдите соответствующие значения "user_id" для каждого content_id в таблицах "node" и "comments", чтобы мы знали, кто создал эти узлы и комментарии.

  3. Подсчитайте, сколько очков набрал каждый user_id, полученный от его узлов и комментариев.

  4. Сортировать эти user_id в обратном порядке и ограничить их отображением только первых 10.

Уф. Это похоже на то, что мне нужно сделать. Теперь, как выглядит этот фактический запрос?

Ответы [ 3 ]

3 голосов
/ 21 декабря 2009

Публикация на основе ответа OMG Ponies

SELECT x.user_id, SUM(x.total_votes)
    FROM (
        SELECT n.user_id, SUM(vav.value) AS total_votes
            FROM NODE n
            JOIN VOTINGAPI_VOTES vav 
                ON vav.content_id = n.nid
                AND vav.content_type = 'node'
            WHERE vav.timestamp > NOW() - 684000
            GROUP BY n.user_id
        UNION
        SELECT c.user_id, SUM(vav.value) AS total_votes
            FROM COMMENTS c
            JOIN VOTINGAPI_VOTES vav 
                ON vav.content_id = c.cid
                AND vav.content_type = 'comment' 
            WHERE vav.timestamp > NOW() - 684000
            GROUP BY c.user_id
    ) x
    GROUP BY 
        x.user_id
    ORDER BY 
        x.total_votes DESC
    LIMIT 10

Проблема с более ранним кодом заключается в том, что он возвращает 2 строки на пользователя, 1 для комментария, 1 для узла. Этот код сделает еще один SUM, чтобы агрегировать его до 1 числа на пользователя.

2 голосов
/ 21 декабря 2009

Использование:

SELECT x.*
  FROM (SELECT n.user_id,
               SUM(vav.value) 'total_votes'
          FROM NODE n
          JOIN VOTINGAPI_VOTES vav ON vav.content_id = n.nid
                                  AND vav.content_type = 'node'
         WHERE vav.timestamp > NOW() - 684000
      GROUP BY n.user_id
       UNION
       SELECT c.user_id,
              SUM(vav.value) 'total_votes'
         FROM COMMENTS c
         JOIN VOTINGAPI_VOTES vav ON vav.content_id = c.cid
                                 AND vav.content_type = 'comment' 
        WHERE vav.timestamp > NOW() - 684000
     GROUP BY c.user_id) x
ORDER BY x.total_votes DESC
   LIMIT 10
0 голосов
/ 21 декабря 2009

Можете ли вы просто использовать модуль Views ? Я уверен, что вы можете ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...