我正在尝试编写一个查询,该查询返回在我的网络应用中过去7天获得最多积分的前10位用户的用户ID。
我有三张桌子,它们共同拥有我需要的信息。
votingapi_votes
表。它对评论或节点的每次上/下投票都有记录。node
表。它可以将节点ID与用户ID相关联,这样您就可以确定谁发布了获得投票的故事。comments
表,对评论也是如此。我相信我需要编写一个查询,从voteapi_vote表的最后一周选择评论或节点上的每一个投票。
这是该表的结构:
所以我选择了一行content_type“node”或“comment”,其Unix时间戳大于time() - 684000。
然后需要
将这些投票分组为“content_id”。
在“节点”和“注释”表中查找每个content_id的相应“user_id”值,以便我们知道谁创建了节点和注释。
计算每个user_id从他的节点和评论中获得的总分数。
按相反的顺序对这些user_id进行排序,并将其限制为仅显示前10个。
呼。这似乎就像我需要做的那样。现在这个实际查询是什么样的?
答案 0 :(得分:3)
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吗?我很确定你可以......