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

PHP、MYSQLでの順位付け(同着処理)を教えて下さい。


同着の場合に、ゴルフの成績表のようなタイ表示ができるランク付けの方法を求めています。

以前にこちらの方で単純な順位付けは教えていただきました。
http://q.hatena.ne.jp/1369613873
結果が求めるものであれば、方法は問いません。


+---------+----------------+
| sub | score | (順位)
+---------+----------------+
| 国語 | 100| (1)
| 算数 | 90| (2)
| 理科 | 90| (2)
| 社会 | 90| (2)
| 図工 | 70| (5)
| 体育 | 60| (6)
| 保健 | 60| (6)
+---------+----------------+


$sql="SELECT sub,score FROM table ORDER BY score DESC ";
$aaa=mysql_query($sql);

while($bbb=mysql_fetch_array($aaa)){
echo $bbb["sub"];
echo $bbb["score"];
echo $bbb["順位"];
}

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

▽最新の回答へ

1 ● ぽけっとしすてむ
●25ポイント

(順位)は、「こうしたい」という事で表記してあるという事で

$aaa=mysql_query($sql);
$rank = 1; $rank_count = 0; $lastscore = null;
while($bbb=mysql_fetch_array($aaa)){ $rank_count++; if ($lastscore !== $bbb["score"]) { $rank = $rank_count; $lastscore = $bbb["score"]; }
echo $bbb["sub"]; echo $bbb["score"]; //echo $bbb["順位"]; echo $rank; }

これで良いかと思いますこうなりました。


jamisさんのコメント
ありがとうございます。 試してみましたが、同着処理がうまくいきません。 同順位の2つ連続、3つ連続の時に次のランクがおかしくなります。 順位に関してはわかりにくく記載してしまいましたが、このような形にしたいとういう希望です。

ぽけっとしすてむさんのコメント
恥ずかしいやつだなぁと修正しました。 すみません。 初出のおまじないは、突然のnull襲来の備えで書きましたが、消しました。

jamisさんのコメント
いえいえ、気になさらないでありがとうございます。

2 ● Numeric
●25ポイント

タイの処理って微妙に面倒ですよね。

<?php
$sql="SELECT sub,score FROM table ORDER BY score DESC ";
$aaa=mysql_query($sql);

$rank = 1;
$tie = 0;
$lastscore = null;

while($bbb=mysql_fetch_array($aaa)){
if($lastscore === $bbb["score"]){
$tie++;
}else{
$rank += $tie;
$tie = 1;
}

$lastscore = $bbb["score"];

echo $bbb["sub"];
echo $bbb["score"];
echo $rank;
}
?>

こんな感じでしょうか。


jamisさんのコメント
ありがとうございます。 思っていたものができました。

3 ● a-kuma3
●25ポイント

ぼくも書いてみました。

<?php
$sql="SELECT sub,score FROM table ORDER BY score DESC ";
$aaa=mysql_query($sql);

$prev = -1;
$rank = 0;
$i = 0;
while($bbb=mysql_fetch_array($aaa)){
 $i += 1;
 if ($prev !== $bbb["score"]) {
 $rank = $i;
 }
 $prev = $bbb["score"];

 echo $bbb["sub"];
 echo $bbb["score"];
 echo $rank;
} 
?>

jamisさんのコメント
ありがとうございます。 思っていたものができました。

4 ● Sampo
●25ポイント

皆様なにをPHPでがんばっておられる。
タイあり着順ならSQLで書き下ろせるではありませんか。

SELECT sub,score,
 (SELECT COUNT(*) FROM table AS sub WHERE sub.score > main.score) + 1 AS rank
 FROM table AS main ORDER BY score DESC

jamisさんのコメント
ありがとうございます。 なかなか難しいselect文ですね。研究してみます。
関連質問

●質問をもっと探す●



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