dポイントプレゼントキャンペーン実施中!

質問です。

PHPにて、MySQLからデータを取得し
取得したデータを順位毎にランキング表示するプログラムを記述しているのですが
順位が重なった場合の処理に試行錯誤しています。

具体的には、野球で言えばホームラン数のランキングのように
MySQLから「名前」「ホームラン数」のみを取得します。
順位は、ホームラン数でORDER BYにてソートします。
しかし実際は、ホームラン数が同数の場合もあるので
そこをPHPロジックにて同率順位として表示できるプログラムを作りたいのです。

一般的にどのような記述方法で実現するのが望ましいのかアドバイス頂ければ幸いです。

A 回答 (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
/* ランキングの出力 */ ;
    • good
    • 0

取り出したデータの書き出し方法にもよりますが。



//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";
}
こんなのはどうでしょう。
ちょっと汚い感じがしますが・・・
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!