【问题标题】:MySQL query to get top 10 point-earners in last week?MySQL 查询上周获得前 10 名积分?
【发布时间】:2009-12-21 06:40:22
【问题描述】:

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

我有三个表,它们一起包含我需要的信息。

  1. votingapi_votes 表。它记录了对评论或节点的每次赞成/反对投票。
  2. node 表。它可以将节点 ID 与用户 ID 相关联,这样您就可以确定谁发布了故事并获得了选票。
  3. comments 表,对 cme​​ts 也是如此。

我相信我需要编写一个查询,从 voteapi_vote 表中选择上周对评论或节点的每一次投票。

这是该表的结构:

  • vote_id
  • content_type
  • content_id
  • 价值
  • value_type
  • 标签
  • uid
  • 时间戳

所以我会选择 Unix 时间戳大于 time() - 684000 的 content_type "node" 或 "comment" 行。

那就需要

  1. 按“content_id”对这些投票进行分组。

  2. 在“node”和“cmets”表中查找每个 content_id 各自的“user_id”值,以便我们知道谁制作了节点和 cmets。

  3. 计算每个 user_id 从他的节点和 cmets 获得的总分。

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

呸。这似乎是我需要做的。现在这个实际的查询是什么样的?

【问题讨论】:

  • value 栏是代表投票的总和,还是代表个人投票? value_type 列的用途是什么 - 如果值为负数或正数?
  • Value_type 将是所有这些的“点”。 “值”将是“1”或“-1”。因此,如果将 content_id 的所有值相加,就可以得到它的当前分数。

标签: php sql mysql drupal


【解决方案1】:

基于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 个数字。

【讨论】:

  • 不确定我是否关注。它们似乎都返回相同的结果。
  • 好的。现在我看到了不同的结果。第二个答案确实对节点和 cmets 的投票进行了求和。但是,它没有按正确的降序列出它们。得分最高的人目前在此查询吐出的列表中排名第三。
【解决方案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

【讨论】:

  • 我认为他的uid 指的是选民ID,而不是评论所有者的ID
  • 几点说明: 1. 我认为第 4 行应该说 content_type,而不是 content_id。 2.“uid”栏不会告诉你谁发布了节点/评论,但谁投票给了它。我们需要从“node”和“cmets”表中获取数据,以确定谁创建了每个节点/评论。 “节点”表的表结构:nid uid cmets 表的表结构 cid uid cid 和 nid 在votingapi_votes 表的 content_id 列中应该有等价物。匹配 content_type "node" 的 content_id 和匹配 content_type "comment" 的 content_id。这就是令人困惑的地方......
  • 我认为我们非常非常接近。我收到一个错误:“'group statement' 中的未知列 'n.user_id'”
  • 将第二个n.user_id改为c.user_id
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2021-10-22
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 2014-01-25
    • 1970-01-01
    • 2022-01-17
    • 2013-04-02
    相关资源
    最近更新 更多