- ベストアンサー
PHPとMysql での順位付け
PHPのバージョンは4.2.3です。 Mysqlにデータを収め 競馬の競争成績の管理用のHPを作っているのですが、 ExcelでいうところのRANK関数のような その列の中でその値が何番目かを調べる機能をつけたいのですが、WEBや本などで調べてみたのですが いまいちわかりませんでした。 OracleにはRANK関数があるようですが Mysqlはないですよね? なんとなくMAX関数で 最大値を抜いてループさせ その回数を数えるとかすれば できそうな気もしてるのですが、 具体的に最大値を抜いてさらにループさせるとか どのようにしたら良いかわかりません。 わかりづらい文章かもしれませんが よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>その列の中でその値が何番目かを調べる機能 列の中でソートして全てのレコード内の何番目かだけなら、大きい方から数えるとして、その値より大きいものがいくつあるかカウントして1足せばいいのでは? 列名 retu 値 xx として以下のようなsql文で select count( * )+1 as rank from table_a where retu > xx; sql4.0 では出来ましたが、これでどうでしょうか? そんな単純な話でなければ、テータイメージなどを補足して頂かないとちょっと解りかねます。
その他の回答 (1)
- wakame0729
- ベストアンサー率32% (245/765)
僕がmysqlを使う理由はとにかく読み出しが速い事で、反面複雑なSQLやjoinを多用すると急に重くなってしまう事もあるので、特に集計作業等はリアルタイムに行うのではなく、集計用のスクリプトをスケジュール実行したりしています。 このような順位付けも僕がやるとしたら、集計用のテーブルを別に作って、元データをソートして順位を付けながら一定時間おきに更新するような事をするでしょう。 どのような順位付けをするのかわかりませんが、 >なんとなくMAX関数で >最大値を抜いてループさせ >その回数を数えるとかすれば >できそうな気もしてるのですが、 この文章から想像するに、1(馬)対多(レース成績?)のデータのMAX値の順位を付けるという事ですか?そうしたらMAX値を馬ごと取得して配列に入れ($配列名[馬ID]=MAX値みたいな感じでどうでしょう)、ソート、そしてループさせて順位をカウントしながら集計用テーブルに挿入、という手順ではどうでしょうか?mysqlはこのような単発のSQLはチョッ速ですから、馬の数だけSQLを実行させてもそれほど時間はかからないかな、と思います。まあ、馬の数にもよりますけど。
補足
集計対象の馬が何十頭かいて 基準は獲得した賞金額で その馬がその中で何番目かというのを 表示させたいということなんです。 なるほどカウントした順位を テーブルに挿入というのは 頭にありませんでしたありがとうございます。 もう少しやってみます。
お礼
なるほど 大変参考になりました。 試してみまありがとうございます。