前提
MYSQLのテーブルの内容
user_id | points(ユーザー獲得ポイント) | exam_id(クイズのレベル) |
---|---|---|
1 | 130 | 5 |
4 | 150 | 1 |
1 | 150 | 5 |
8 | 150 | 5 |
4 | 140 | 5 |
56 | 120 | 3 |
32 | 70 | 5 |
32 | 10 | 5 |
11 | 10 | 5 |
クイズのサイトを作成しています。上記のテーブルを使用して、ユーザーを高得点順にランキング形式で表示させたいと思っています。
実現したいこと
実現したい内容
user_id | points | exam_id | RANK |
---|---|---|---|
1 | 150 | 5 | 1(位) |
8 | 150 | 5 | 1(位)同位の場合はタイ表示 |
4 | 140 | 5 | 3(位) |
32 | 70 | 5 | 4(位) |
11 | 10 | 5 | 5(位) |
■同位がある場合はタイ表示
■exam_id毎に表示させる
■各user_idは重複させず、高得点のみ表示
試した事 / 質問点
user_id | points | exam_id | RANK | 備考 |
---|---|---|---|---|
1 | 150 | 5 | 1 | |
8 | 150 | 5 | 1 | |
4 | 140 | 5 | 2 | |
1 | 130 | 5 | 3 | ←user_idは高得点のみ表示させ、重複させたくない |
32 | 70 | 5 | 4 | |
32 | 10 | 5 | 5 | ←user_idは高得点のみ表示させ、重複させたくない |
11 | 10 | 5 | 5 |
下記該当のソースコードでランクのタイ表示はできたのですが、クイズは何度でも受けられる事から、上の表の様にuser_id 1やuser_id 32が重複してランクインされてしまいます
user_idは重複させず、なおかつ、排除した分はランクが繰り上がる様にしたいのですが、どの様な書き方がよいのでしょうか?
よろしくお願いいたします。
該当のソースコード
SELECT user_id, points, exam_id, (SELECT COUNT(DISTINCT points) FROM ranking b WHERE exam_id='5' AND a.points < b.points ) + 1 rank FROM ranking a WHERE exam_id='5' -- クイズのレベル ORDER BY rank ASC
補足情報(バージョンなど)
phpMyAdmin
バージョン情報: 4.7.9
回答3件
あなたの回答
tips
プレビュー