• ベストアンサー

PHPとMysql での順位付け

PHPのバージョンは4.2.3です。 Mysqlにデータを収め 競馬の競争成績の管理用のHPを作っているのですが、 ExcelでいうところのRANK関数のような その列の中でその値が何番目かを調べる機能をつけたいのですが、WEBや本などで調べてみたのですが いまいちわかりませんでした。 OracleにはRANK関数があるようですが Mysqlはないですよね? なんとなくMAX関数で 最大値を抜いてループさせ その回数を数えるとかすれば できそうな気もしてるのですが、 具体的に最大値を抜いてさらにループさせるとか どのようにしたら良いかわかりません。 わかりづらい文章かもしれませんが よろしくお願いします。

  • PHP
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.2

>その列の中でその値が何番目かを調べる機能 列の中でソートして全てのレコード内の何番目かだけなら、大きい方から数えるとして、その値より大きいものがいくつあるかカウントして1足せばいいのでは? 列名 retu 値 xx として以下のようなsql文で select count( * )+1 as rank from table_a where retu > xx; sql4.0 では出来ましたが、これでどうでしょうか? そんな単純な話でなければ、テータイメージなどを補足して頂かないとちょっと解りかねます。

DRAGONEMK
質問者

お礼

なるほど 大変参考になりました。 試してみまありがとうございます。

その他の回答 (1)

回答No.1

僕がmysqlを使う理由はとにかく読み出しが速い事で、反面複雑なSQLやjoinを多用すると急に重くなってしまう事もあるので、特に集計作業等はリアルタイムに行うのではなく、集計用のスクリプトをスケジュール実行したりしています。 このような順位付けも僕がやるとしたら、集計用のテーブルを別に作って、元データをソートして順位を付けながら一定時間おきに更新するような事をするでしょう。 どのような順位付けをするのかわかりませんが、 >なんとなくMAX関数で >最大値を抜いてループさせ >その回数を数えるとかすれば >できそうな気もしてるのですが、 この文章から想像するに、1(馬)対多(レース成績?)のデータのMAX値の順位を付けるという事ですか?そうしたらMAX値を馬ごと取得して配列に入れ($配列名[馬ID]=MAX値みたいな感じでどうでしょう)、ソート、そしてループさせて順位をカウントしながら集計用テーブルに挿入、という手順ではどうでしょうか?mysqlはこのような単発のSQLはチョッ速ですから、馬の数だけSQLを実行させてもそれほど時間はかからないかな、と思います。まあ、馬の数にもよりますけど。

DRAGONEMK
質問者

補足

集計対象の馬が何十頭かいて 基準は獲得した賞金額で その馬がその中で何番目かというのを 表示させたいということなんです。 なるほどカウントした順位を テーブルに挿入というのは 頭にありませんでしたありがとうございます。 もう少しやってみます。

関連するQ&A

  • PHP?MySQL?どちらで処理するか?

    MySQLでもPHPでもできる処理ってあるやん? 掲示板で見かける指定文字以上のタイトルになったら、それ以降は”...”で表示するのはPHPのmb_strimwidth(?)でも、MySQLのleft関数でもできると思います。 round関数も元の値をPHPで四捨五入するのか、MySQLで元の値を別のフィールド名で、、、。 どっちがええん? なんか線引きが難しくって、訳分からん。 何か基準というか、線引きはないかなー? やっぱり、大量の処理はMySQL?

    • ベストアンサー
    • MySQL
  • MySQLについて

    MySQLを使い始めました。 OracleでNVLというNULL値を他の値に変換する関数がありますが、 MySQLで、このような関数は有りませんか?

  • phpでmysqlを使ってデータベース内の最大値の取得

    PHPでMYSQL内テーブル(hogehoge)の「no」フィールドの最大値を取得をしたいのですが、ほしい結果が得られません。 【PHP】 -------------------------------------------------------------- $my_Max = "select max(no) from hogehoge"; $kekka_max = mysql_query($my_Max); -------------------------------------------------------------- no→今回最大値を取得したい項目(int) 【結果】 これをechoで出力すると、 ----------------------------- Resource id #4 ----------------------------- となってしまいます。 「no」の中の最大値を取得したいのですが、どうしたらよいでしょうか? 【環境】 WindowsXP mysql:5.0.51 php:5.2.5

    • ベストアンサー
    • PHP
  • phpとmysqlを使っています。

    phpとmysqlを使っています。 列はID、NAME、SUBID がある場合に、 IDが X の行の SUBID に 値を挿入するにはどうしたらいいのでしょうか。

    • ベストアンサー
    • PHP
  • PHP/MySQLであいまい検索を

    HP上のテキストボックスに文字を入力し、その値をPHPでMySQL上のデータベースよりあいまい検索をし 該当するデータを表示したいのですが、私の検索キーワードが悪いのか、いいサンプルソースが見つけられません。 MySQLのREGEXP関数を使ってあいまい検索を 行うサンプルは見つけたんですが、これは日本語対応では なく検索文字列によってはうまく検索できない場合が あると聞きました。 何かよいサンプルがあったらURLもしくは ソースをそのままで結構ですので貼り付けていただければ 助かります。 では、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 数列のランキングを求めるには?

    例えば、A列に任意の数字の羅列があるとします。 仮に、A1からA5までで、 5 7 17 13 11 とすると、最大値はMAX関数、最小値はMIN関数で求められますが、 ”2番目に大きい値”や、 ”4番目に大きい値”を抽出する関数、 もしくは、 B5のセルに『A5は3番目に大きい値だよ』 と返してくれるような関数はありますでしょうか?  よろしくご教示の程お願いします m(_ _)m

  • MYSQL 右埋め 半角スペース

    MYSQLで右埋めで指定回数分、半角スペースを埋めることは可能でしょうか? オラクルでは RPAD(文字列 , 指定桁数)  可能ですが、 MYSQLでは?

    • ベストアンサー
    • MySQL
  • 順位の関数

    よろしくお願いします。 予定表を作っています。 A列=氏名、B列=時間帯、C列=順番(関数入力) Aさん 10時 1番 Bさん 10時 1番 Cさん 10時 1番 Dさん 11時 2番 ランク関数を使うとDさんは4番になります。 2番にする方法はないでしょうか??

  • MySQLでの配列について

    MySQLについての質問です。 配列に関してわからないことがでてきました。 PHP側からMySQLに接続しデータを配列として取得するやり方をどなたか教えてください。 MySQL側にはseatというテーブルを用意してあります。 --------------- |seat|max|flag| |-------------| |A1 | 4 | 0 | |-------------| |A2 | 4 | 0 | |-------------| |B1 | 6 | 0 | |-------------| |B2 | 6 | 0 | |-------------| |C1 | 5 | 0 | |-------------| 以上のようにそのシート名、収容最大人数をデータとして保存しております。 PHP側からアクセスしてPHP側の$number(人数)と照らし合わせ、この$numberより$maxが多い時、このテーブルからシート名だけを取り出し、その値を配列として取得したいときSQL文をどのようにかけばよろしいでしょうか? へたくそな説明だとは思いますが、どなたかお願いいたします。

  • PHP/mySQLでインサートができません。

    PHPとmySQLを勉強中の初心者ですが、よろしくお願いします。 PHPで簡単なインサート文を作ってそれをmySQLに保存しようとしているのですが、以下のエラーが出てしまいます。 Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource プログラムは以下の通りです。HOSTNAME,USERNAME,DBPWDは別のところで定義していますが、mysql_connect, mysql_select_dbではエラーにならないので、データベースの選択まではうまく行っていると思うのですが。 $conn = mysql_connect(HOSTNAME, USERNAME, DBPWD); if(!$conn){ die("Logon Failure to mysql Server."); } $db = mysql_select_db(DBNAME, $conn); if(!$db){ die("Cannot access to the DB"); } foreach($csv_ary as $a => $b) { $query = "INSERT INTO TEST field_a VALUES $a"; if (!mysql_query($query, $db)){ echo "更新失敗: SQL=$query<br>"; } } mysql_close($conn); field_aはvarchar(10)でPrimary_key, NOT NULLの設定です。 Foreachで展開した配列の値はちゃんと長さ10の文字列が入っています。 PHP 4.3.11は mySQL 4.0.27です。 よろしくお願いします。

    • ベストアンサー
    • PHP