有点背景信息;这是一个应用程序,它允许用户创建挑战,然后对这些挑战进行投票(bog标准userX-vs-userY类型的应用程序)。MySQL嵌套查询计数
这里的最终目标是根据他们赢得的挑战数量得到一个5位用户的列表,以创建一种排行榜。如果用户的状态=过期并且用户对该挑战> 50票(挑战在总共100张表决后失效),则用户赢得挑战。
我会有点简化这里的东西,但本质上有三个表:
用户
- ID
- 用户名
- ...
挑战
- ID
- ISSUED_TO
- ISSUED_BY
- 状态
challenges_votes
- ID
- challenge_id
- user_id说明
- voted_for
到目前为止,我有一个内部查询,看起来像:
SELECT `challenges`.`id`
FROM `challenges_votes`
LEFT JOIN `challenges` ON (`challenges`.`id` = `challenges_votes`.`challenge_id`)
WHERE `voted_for` = 1
WHERE `challenges`.`status` = 'expired'
GROUP BY `challenges`.`id`
HAVING COUNT(`challenges_votes`.`id`) > 50
在这个例子中会返回已过期,并在那里挑战的ID与用户ID 1有超过50票赞成票。
我需要做的是计算行数回到这里,它适用于从用户表中的每个用户,通过行数订购回来,把它限制在5
为此我有以下查询:
SELECT `users`.`id`, `users`.`username`, COUNT(*) AS challenges_won
FROM (
SELECT `challenges`.`id`
FROM `challenges_votes`
LEFT JOIN `challenges` ON (`challenges`.`id` = `challenges_votes`.`challenge_id`)
WHERE `voted_for` = 1
GROUP BY `challenges`.`id`
HAVING COUNT(`challenges_votes`.`id`) > 0
) AS challenges_won, `users`
GROUP BY `users`.`id`
ORDER BY challenges_won
LIMIT 5
这是有点越来越有,但当然这里的voted_for
用户ID始终是1。这甚至去了解这种类型的查询的正确方法吗?任何人都可以阐明我应该如何做到这一点?
谢谢!
嗨,你能否提供关于你的表格结构的更多细节?我认为'challenges_votes'会有user_id,但我在你的查询中找不到它。 –
'challenges_votes'中的voted_for列是投票的用户ID,而user_id是投票本身(与此查询无关)的用户的ID。 – paulbennett