人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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)"];
}


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


●質問者: jamis
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● きゃづみぃ
●5ポイント

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

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


jamisさんのコメント
ありがとうございます。

2 ● だわかき
●55ポイント ベストアンサー

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"];
?>

jamisさんのコメント
素晴らしいです。 最後の$avgは$arrですね。変更したら思うとおりの結果がでました。 ありがとうございます。 今後の知識として取り入れたいので、よろしければこの2行を詳しく解説してもらえないでしょうか? だいたいの意味はつかめるのですが、このような書き方を初めて見ました。 $arr[$avg["sub"]]["rank"] = $i; $arr[$avg["sub"]]["score"] = $avg["AVG(score)"];

jamisさんのコメント
$arr[$avg["sub"]]["rank"] = $i $arr[$avg["sub"]]["score"] = $avg["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

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

3 ● holoholobird
●40ポイント

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は文字列や数で置き換えることができるので、そこに注目すると意味がつかみやすくなるかもしれません。


jamisさんのコメント
詳細な説明ありがとうございます。 単純化すると理解できました。 簡単なものだったんですね。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ