MySQL查询在上周获得前十名收入者?

时间:2009-12-21 06:40:22

标签: php sql mysql drupal

我正在尝试编写一个查询,该查询返回在我的网络应用中过去7天获得最多积分的前10位用户的用户ID。

我有三张桌子,它们共同拥有我需要的信息。

  1. votingapi_votes表。它对评论或节点的每次上/下投票都有记录。
  2. node表。它可以将节点ID与用户ID相关联,这样您就可以确定谁发布了获得投票的故事。
  3. comments表,对评论也是如此。
  4. 我相信我需要编写一个查询,从voteapi_vote表的最后一周选择评论或节点上的每一个投票。

    这是该表的结构:

    • vote_id
    • CONTENT_TYPE
    • CONTENT_ID
    • VALUE_TYPE
    • 标签
    • UID
    • 时间戳

    所以我选择了一行content_type“node”或“comment”,其Unix时间戳大于time() - 684000。

    然后需要

    1. 将这些投票分组为“content_id”。

    2. 在“节点”和“注释”表中查找每个content_id的相应“user_id”值,以便我们知道谁创建了节点和注释。

    3. 计算每个user_id从他的节点和评论中获得的总分数。

    4. 按相反的顺序对这些user_id进行排序,并将其限制为仅显示前10个。

    5. 呼。这似乎就像我需要做的那样。现在这个实际查询是什么样的?

3 个答案:

答案 0 :(得分:3)

根据OMG Ponies' answer

发布
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个数字。

答案 1 :(得分:2)

使用:

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

答案 2 :(得分:0)

你能使用Views module吗?我很确定你可以......