同着の場合に、ゴルフの成績表のようなタイ表示ができるランク付けの方法を求めています。
以前にこちらの方で単純な順位付けは教えていただきました。
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["順位"];
}
(順位)は、「こうしたい」という事で表記してあるという事で
$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; }
タイの処理って微妙に面倒ですよね。
<?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; } ?>
こんな感じでしょうか。
ありがとうございます。
思っていたものができました。
ぼくも書いてみました。
<?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; } ?>
ありがとうございます。
思っていたものができました。
皆様なにを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
ありがとうございます。
なかなか難しいselect文ですね。研究してみます。
恥ずかしいやつだなぁと修正しました。
2013/07/09 18:41:33すみません。
初出のおまじないは、突然のnull襲来の備えで書きましたが、消しました。
いえいえ、気になさらないでありがとうございます。
2013/07/09 18:49:19