背景情報のビット。これはユーザーが課題を作成し、その課題に投票できるようにするアプリケーションです(標準のuserX-vs-userYタイプのアプリケーション)。MySQLネストされたクエリカウント
最後の目標は、リーダーボードの種類を作成するために、獲得したチャレンジの数でソートされた5人のユーザーのリストを取得することです。ステータスが期限切れで、ユーザーがそのチャレンジに対して50以上の票を得た場合(チャレンジは100回の投票の後に終了する)、チャレンジはユーザーによって獲得されます。
私は少しここでは、物事を単純化しますが、基本的に3つのテーブルがあります。
ユーザー
- ID
- ユーザ名
- ...
は
チャレンジ
- ID
- issued_to
- ステータス
- issued_by
challenges_votes
- ID
- は をchallenge_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 1の投票権は> 50です。
私は何をする必要があることは、行数がここで返された回数のユーザーテーブルから各ユーザーにそれを適用する、返される行の数でこれを注文し、そのためには5
に制限されるI次のクエリを持っている:
ちょっとそこなったが、もちろん、ここでvoted_for
ユーザーIDは常に1です 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
が、これはこのタイプの問合せについて移動するにも正しい方法ですか?どのように私はそれをやっている必要がありますについて誰も光を当てることができますか?
ありがとうございます!
こんにちは、あなたのテーブル構造についての詳細を教えてください。私は 'challeng_votes'にuser_idがあると思っていましたが、あなたの質問でそれを見つけることはできません。 –
'challeng_votes'のvoted_for列は投票者のユーザーIDですが、user_idは投票自体を行ったユーザーのIDです(このクエリでは関係ありません)。 – paulbennett