$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)"];
}
この中で、任意の教科の平均点の順位は何位なのか、そして平均点は何点なのかを取り出したいのです。
例 理科は何位か?点数は?
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"]; ?>
http://think-x.cocolog-nifty.com/blog/2009/12/post-8.html
こちらに記載があるように 行番号を付与してやれば、何位というのが わかると思いますよ。
ありがとうございます。
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"]; ?>
回答の一部が間違っていてごめんなさい。
$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
ありがとうございます。
これは単純な連想配列だったんですね。
変数が入っていたので読み違えて、特殊な方法でキーに変数を代入するような形があるのかと勘違いしてしまっていました。
$arr[0][1]=1に単純化して、理解できました。
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は文字列や数で置き換えることができるので、そこに注目すると意味がつかみやすくなるかもしれません。
詳細な説明ありがとうございます。
単純化すると理解できました。
簡単なものだったんですね。
回答の一部が間違っていてごめんなさい。
2013/05/27 18:27:01$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/28 08:29:45これは単純な連想配列だったんですね。
変数が入っていたので読み違えて、特殊な方法でキーに変数を代入するような形があるのかと勘違いしてしまっていました。
$arr[0][1]=1に単純化して、理解できました。