###やりたいこと
ユーザーID、問題番号、取り組み時間、取り組み時刻、得点が記録されているログを取り出し、TOP5までのランキングを作成する。
ランキングの種類としては、①取り組み回数の多さランキング、②取り組み時間の長さランキング、③総得点の高さランキング(同じ問題が複数回取り組まれた場合は、最高点を採用)、④問題ごとのいち早く解いた人ランキングを考えている。
ユーザーがランキングを表示する際に計算させることで、常に最新の情報を出力させたい。
###データベースの状況
ユーザーID、問題番号、取り組み時間、取り組み時刻、得点というカラムがあるテーブルに、問題が終わるごとにそれらの情報をINSERTすることで蓄積していく。
###現在考えている方針
ユーザーidを格納した行列$idsをforeachで反復し、さらに問題番号を格納した行列$contentsを反復する中でランキングを作る。
MySQL
1$ids=array()//ユーザーIDの格納した行列 2$contents=array()//問題番号を格納した行列 3 4$con=mysqli_connect(host, username, password, database); 5foreach($ids as $i){ 6 $data=mysqli_query($con,"select contents,t,score from log where user =$i"); 7 $farray=mysqli_fetch_array($data,$mode=MYSQLI_ASSOC); 8 foreach($contents as $j){ 9 10 } 11}
###利用環境
MySQL 5.0.95
PHP 7.1.x
phpMyAdmin 2.11.11.3
レンタルサーバー xfree
###最後に
ここまでは作ってみたのですが、そのあとどのような処理をさせればよいか、悩んでいます。
皆様のお力をぜひお貸しください。よろしくお願いいたします。
###加筆
hoshi-takanori様
phpMyAdminを用いてデータベース作成し、CREATE TABLE 文は手元の残っておりません。
ただし、phpMyAdminでは画像のような状態になっています。
stは回答開始時刻、enは回答終了時刻、tは回答時間です。
サンプルとしては、上から順に
1000000,1000,210102030400,210102030430,30,3
というものが考えられます。
210102030400は2021年01月02日03時04分00秒を表します。
また、いち早く解いた人については、10問あれば50人表示する予定でいます。
###サンプルデータ
1000000,1000,210102030400,210102030430,30,1
1000000,1000,210102030900,210102090430,30,2
1000000,1001,210102031100,210102091140,40,3
1000000,1002,210102031000,210102091040,40,2
1000000,1003,210102032000,210102092040,40,3
1000000,1004,210102032050,210102092130,40,3
1000001,1001,210103030400,210102030420,20,2
1000003,1001,210103030400,210102030420,20,2
1000005,1001,210103030400,210102030420,20,2
1000005,1002,210103030500,210102030520,20,2
1000006,1011,210104110223,210104110252,29,2
1000007,1000,210102112555,210102112613,18,1
1000007,1001,210104110224,210104110256,32,0
1000008,1000,210103031200,210102031234,34,1
1000008,1003,210103031400,210102031433,33,2
1000008,1003,210103031500,210102031544,44,2
1000008,1003,210103031633,210102031700,27,3
1000010,1001,210104030400,210104030420,20,2
1000011,1005,210104110200,210104110252,52,2
1000015,1001,210103030400,210102030420,10,0
1000015,1001,210103030600,210102030620,20,2
1000015,1001,210103030700,210102030720,20,3
1000016,1005,210103030900,210102030920,20,3
1000016,1005,210103030900,210102030920,20,3
1000017,1002,210103030900,210102030931,31,0
1000017,1003,210103031100,210102031231,31,1
1000020,1010,210102031000,210102031030,30,3
1000021,1010,210102030430,210102030600,90,0
1000021,1010,210102030730,210102030742,42,1
1000021,1010,210103030730,210103030745,45,2
1000022,1011,210102030401,210102030432,32,3
1000022,1000,210102030400,210102030430,30,2
1000022,1000,210102030500,210102030520,20,3
1000022,1003,210104030500,210104030520,20,3
1000022,1000,210105030500,210105030520,20,3
回答1件
あなたの回答
tips
プレビュー