質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

解決済

mysqlを用いてログからランキングを作成

M.I.
M.I.

総合スコア3

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

1回答

0評価

0クリップ

332閲覧

投稿2021/09/22 00:09

編集2021/09/23 00:54

###やりたいこと
ユーザーID、問題番号、取り組み時間、取り組み時刻、得点が記録されているログを取り出し、TOP5までのランキングを作成する。
ランキングの種類としては、①取り組み回数の多さランキング、②取り組み時間の長さランキング、③総得点の高さランキング(同じ問題が複数回取り組まれた場合は、最高点を採用)、④問題ごとのいち早く解いた人ランキングを考えている。
ユーザーがランキングを表示する際に計算させることで、常に最新の情報を出力させたい。

###データベースの状況
ユーザーID、問題番号、取り組み時間、取り組み時刻、得点というカラムがあるテーブルに、問題が終わるごとにそれらの情報をINSERTすることで蓄積していく。

###現在考えている方針
ユーザーidを格納した行列$idsをforeachで反復し、さらに問題番号を格納した行列$contentsを反復する中でランキングを作る。

MySQL

$ids=array()//ユーザーIDの格納した行列 $contents=array()//問題番号を格納した行列 $con=mysqli_connect(host, username, password, database); foreach($ids as $i){ $data=mysqli_query($con,"select contents,t,score from log where user =$i"); $farray=mysqli_fetch_array($data,$mode=MYSQLI_ASSOC); foreach($contents as $j){ } }

###利用環境
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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

hoshi-takanori

2021/09/22 00:26

テーブル定義は SQL の CREATE TABLE 文が欲しいです。(できればサンプルデータも。) ランキングは SQL で計算すると良いと思います。また、④ 問題ごとのいち早く解いた人ランキングは、問題が 10 問あれば 50 人分すべて表示しますか?
M.I.

2021/09/22 00:59

追記・修正の依頼をありがとうございます。 質問を編集いたしましたので、ご覧いただければ幸いです。
yambejp

2021/09/22 00:59

>MySQL 5.0 バージョンは間違いないですか? せめて5.6とか5.7じゃないと使えない機能が多いですが・・・ (現バージョン8.0系ですし)
hoshi-takanori

2021/09/22 02:16 編集

例えば ① は、こんな感じでしょうか。(同じ人が同じ問題を複数回数えたら重複して数えますが。) select user, count(*) as count from log group by user order by count desc limit 5; あと、ランキングを求めるので、テストデータは数十件は欲しいですね。(自分で作ろうかとも思ったけど、面倒なのでやめました。)
M.I.

2021/09/22 04:14

>yambejp様 確認しましたが、5.0で間違いないようです。 レンタルサーバー(xfree)上で動いているもので、更新は難しいかもしれません。
M.I.

2021/09/22 05:01 編集

>hoshi-takanori様 ①につきまして、例をお示しいただきありがとうございます。 重複して数える予定なので、その方法を試してみたいと思います。 テストデータは30件ほどですが、追記させていただきました。
M.I.

2021/09/25 10:53

>hoshi-takanori様 リンク先でコードを実行し、所望の結果が得られることを確認いたしました。 ありがとうございます。 もし、よろしければ、貴方のお答えをベストアンサーにしたいのですが、回答としてお答えいただけますでしょうか。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。