• 締切済み

ランキング表示のプログラム

質問です。 PHPにて、MySQLからデータを取得し 取得したデータを順位毎にランキング表示するプログラムを記述しているのですが 順位が重なった場合の処理に試行錯誤しています。 具体的には、野球で言えばホームラン数のランキングのように MySQLから「名前」「ホームラン数」のみを取得します。 順位は、ホームラン数でORDER BYにてソートします。 しかし実際は、ホームラン数が同数の場合もあるので そこをPHPロジックにて同率順位として表示できるプログラムを作りたいのです。 一般的にどのような記述方法で実現するのが望ましいのかアドバイス頂ければ幸いです。

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

たとえば、こんな風にMySQL側で処理する手もあります。 MySQLのバージョンによってはもう少し効率的な書き方もできるかと。 CREATE TABLE `ranking` (`player` VARCHAR(20) NOT NULL ,`HR` int,PRIMARY KEY (`player`)); INSERT INTO `ranking` VALUES ('a',20), ('b',20), ('c',15), ('d',25), ('e',10), ('f',5), ('g',10), ('h',25), ('i',5), ('j',20), ('k',5), ('l',25), ('m',5), ('n',10) /* データ挿入 */ ; SET @RANK=0 /* 変数初期化 */; CREATE TEMPORARY TABLE `tempranking` SELECT `HR`,@RANK+1 AS `rank`,@RANK:=@RANK+COUNT(*) AS `count` FROM `ranking` GROUP BY HR ORDER BY HR DESC /* ランキングのカウント */ ; SELECT `player`,`rank`,`ranking`.`HR` FROM `ranking` INNER JOIN `tempranking` USING(`HR`) ORDER BY `HR` DESC /* ランキングの出力 */ ;

回答No.1

取り出したデータの書き出し方法にもよりますが。。 //MySQLで取ってきたデータ $data = array( array('name1'=>36), array('name2'=>35), array('name3'=>34), array('name4'=>34), array('name5'=>33), array('name6'=>33), array('name7'=>33), array('name8'=>29) ); $last = 0; $rank = 0; $tmp_rank = 1; foreach($data as $_v) { list($name, $num) = each($_v); if ($last == $num) { $tmp_rank++; } else { $rank += $tmp_rank; $tmp_rank = 1; } $last = $num; echo "$rank 位 $name\n"; } こんなのはどうでしょう。 ちょっと汚い感じがしますが・・・