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["順位"];
}

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2013/07/09 02:04:59
  • 終了:2013/07/10 18:47:47

回答(4件)

id:psne No.1

ぽけっとしすてむ回答回数441ベストアンサー獲得回数2362013/07/09 08:28:35

ポイント25pt

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

$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; }

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

他1件のコメントを見る
id:psne

恥ずかしいやつだなぁと修正しました。
すみません。
初出のおまじないは、突然のnull襲来の備えで書きましたが、消しました。

2013/07/09 18:41:33
id:jamis

いえいえ、気になさらないでありがとうございます。

2013/07/09 18:49:19
id:Numeric No.2

Numeric回答回数83ベストアンサー獲得回数182013/07/09 12:59:04

ポイント25pt

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

<?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;
}
?>

こんな感じでしょうか。

id:jamis

ありがとうございます。
思っていたものができました。

2013/07/09 18:49:55
id:a-kuma3 No.3

a-kuma3回答回数4365ベストアンサー獲得回数18012013/07/09 13:42:03

ポイント25pt

ぼくも書いてみました。

<?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;
} 
?>
id:jamis

ありがとうございます。
思っていたものができました。

2013/07/09 18:50:37
id:Sampo No.4

Sampo回答回数556ベストアンサー獲得回数1042013/07/09 15:42:42

ポイント25pt

皆様なにを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
id:jamis

ありがとうございます。
なかなか難しいselect文ですね。研究してみます。

2013/07/09 18:51:49

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません