PHP、MYSQLでの順位付けとデータの取り出し方を教えてください。


$sql="SELECT sub,AVG(score) FROM table GROUP BY sub ORDER BY AVG(score) DESC ";

+---------+----------------+
| sub | AVG(score) |
+---------+----------------+
| 国語 | 100|
| 算数 | 90|
| 理科 | 80|
| 社会 | 70|
| 図工 | 60|
+---------+----------------+

このような形で、データベースから各教科の平均点を高い順番に抜き出しました。

そして以下の様にして、テーブルのすべての内容をはき出しました。

//全体の順位付け。
$aaa=mysql_query($sql);
while($avg=mysql_fetch_array($aaa)){
echo $avg["sub"];
echo $avg["AVG(score)"];
}


この中で、任意の教科の平均点の順位は何位なのか、そして平均点は何点なのかを取り出したいのです。
例 理科は何位か?点数は?

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/05/28 08:31:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:dawakaki No.2

回答回数797ベストアンサー獲得回数122

ポイント55pt

DBから配列に取り込む時に、順位も取り込む方法を紹介します。
以下のプログラムを試してみてください。

<?php
//全体の順位付け。
$aaa=mysql_query($sql);
$i = 1;
while($avg=mysql_fetch_array($aaa)){
  $arr[$avg["sub"]]["rank"] = $i
  $arr[$avg["sub"]]["score"] = $avg["AVG(score)"];
  $i++;
  echo $avg["sub"];
  echo $avg["AVG(score)"]; 
}

//理科の順位と平均点を表示
echo $avg["理科"]["rank"];
echo $avg["理科"]["score"];
?>
他2件のコメントを見る
id:dawakaki

回答の一部が間違っていてごめんなさい。

$arr[$avg["sub"["rank"] = $i;
$arr[$avg["sub"["score"] = $avg["AVG(score)"];

$arr["理科"] のように、配列の添え字に文字を使うのを「連想配列」と言います。
http://www.php-labo.net/tutorial/php/hash.html
いちいち文字列検索しなくても目的のデータを得ることができるので、質問みたいなケースで重宝します。

$arr["理科"]["rank"] のように添え字が2つあるのは2次元配列と言います。
添え字が3つなら3次元、4つなら4次元‥‥と幾つでも増やせます。
多次元配列と言います。
http://www.phpbook.jp/tutorial/array/index6.html

2013/05/27 18:27:01
id:jamis

ありがとうございます。
これは単純な連想配列だったんですね。
変数が入っていたので読み違えて、特殊な方法でキーに変数を代入するような形があるのかと勘違いしてしまっていました。
$arr[0][1]=1に単純化して、理解できました。

2013/05/28 08:29:45

その他の回答2件)

id:taknt No.1

回答回数13539ベストアンサー獲得回数1198

ポイント5pt

http://think-x.cocolog-nifty.com/blog/2009/12/post-8.html

こちらに記載があるように 行番号を付与してやれば、何位というのが わかると思いますよ。

id:jamis

ありがとうございます。

2013/05/27 17:21:54
id:dawakaki No.2

回答回数797ベストアンサー獲得回数122ここでベストアンサー

ポイント55pt

DBから配列に取り込む時に、順位も取り込む方法を紹介します。
以下のプログラムを試してみてください。

<?php
//全体の順位付け。
$aaa=mysql_query($sql);
$i = 1;
while($avg=mysql_fetch_array($aaa)){
  $arr[$avg["sub"]]["rank"] = $i
  $arr[$avg["sub"]]["score"] = $avg["AVG(score)"];
  $i++;
  echo $avg["sub"];
  echo $avg["AVG(score)"]; 
}

//理科の順位と平均点を表示
echo $avg["理科"]["rank"];
echo $avg["理科"]["score"];
?>
他2件のコメントを見る
id:dawakaki

回答の一部が間違っていてごめんなさい。

$arr[$avg["sub"["rank"] = $i;
$arr[$avg["sub"["score"] = $avg["AVG(score)"];

$arr["理科"] のように、配列の添え字に文字を使うのを「連想配列」と言います。
http://www.php-labo.net/tutorial/php/hash.html
いちいち文字列検索しなくても目的のデータを得ることができるので、質問みたいなケースで重宝します。

$arr["理科"]["rank"] のように添え字が2つあるのは2次元配列と言います。
添え字が3つなら3次元、4つなら4次元‥‥と幾つでも増やせます。
多次元配列と言います。
http://www.phpbook.jp/tutorial/array/index6.html

2013/05/27 18:27:01
id:jamis

ありがとうございます。
これは単純な連想配列だったんですね。
変数が入っていたので読み違えて、特殊な方法でキーに変数を代入するような形があるのかと勘違いしてしまっていました。
$arr[0][1]=1に単純化して、理解できました。

2013/05/28 08:29:45
id:holoholobird No.3

回答回数574ベストアンサー獲得回数104

ポイント40pt

whileで平均点が高い順にデータを抽出しています。
1回目のループでは、平均点が1番高い"国語"が配列変数$avgに
$avg["sub"]="国語";
$avg["AVG(score)"]="100";
が格納されます。

ループ内の動作で、別の変数配列$arrに、
$arr["国語"]["rank"]=1;
$arr["国語"]["score"]=100;
を代入しています。

while後に$i++とするので、$iは2になります。

2回目のループでは、平均点が2番目に高い"算数"について、$iが2なので

$arr["算数"]["rank"]=2;
$arr["算数"]["score"]=90;

3回目では……となります。

ループ中、国語や算数といったデータに相当するものは
$avg["sub"];
であり、点数に相当するものは
$avg["AVG(score)"]
ですので、これを文字列の代わりとして使用しているのです。

while中の$avgは文字列や数で置き換えることができるので、そこに注目すると意味がつかみやすくなるかもしれません。

id:jamis

詳細な説明ありがとうございます。
単純化すると理解できました。
簡単なものだったんですね。

2013/05/28 08:29:42

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません