有點背景信息;這是一個應用程序,它允許用戶創建挑戰,然後對這些挑戰進行投票(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