ランキング用データを取得したいのですが
MYSQL5.0系ではどうしたらいいでしょうか?
+------------+
|C | A | B |
+------------+
|1 |401 | 4 |
+------------+
|2 |501 | 1 |
+------------+
|3 |601 | 2 |
+------------+
|4 |701 | 3 |
+------------+
|5 |801 | 2 |
+------------+
|6 |901 | 0 |
+------------+
結果1
1位 401
2位 301
3位 601
3位 801
5位 501
6位 901
さらにここの5位までを取得したいのですが
どういうSQLを組めばいいでしょうか?
結果2
1位 401
2位 301
3位 601
3位 801
5位 501
以上、宜しくお願い致します。
存在しないデータがあるので、301=701と想定して回答します。
また、ソート条件も示されていないので、結果が期待値の表示になるようにだけ考慮しています。
SET @r=0;
SELECT concat(concat((@r:=@r+1),'位 ') , A) as '結果1' FROM `TEST` ORDER BY B DESC
SET @r=0;
SELECT concat(concat((@r:=@r+1),'位 ') , A) as '結果1' FROM `TEST` ORDER BY B DESC LIMIT 0, 5
ADODBのコネクトが$connだとして、
$recordSet = &$conn->Execute('SELECT A FROM `TEST` ORDER BY B DESC'); if (!$recordSet){ print $conn->ErrorMsg(); }else{ $i = 1; while (!$recordSet->EOF) { print $i++."位 ".$recordSet->fields[0].'<BR>'; $recordSet->MoveNext(); } }
$recordSet = &$conn->Execute('SELECT A FROM `TEST` ORDER BY B DESC LIMIT 0,5'); if (!$recordSet){ print $conn->ErrorMsg(); }else{ $i = 1; while (!$recordSet->EOF) { print $i++."位 ".$recordSet->fields[0].'<BR>'; $recordSet->MoveNext(); } }
こんな感じでどうでしょう。
下のやつだと5件だけしかもって来ませんよね?
それとも同位の場合は可能でしょうか?
以下のようなイメージでしょうか。
(表示部分はもうちょっとマシなやり方があった気がしますが。)
<?php include('adodb/adodb.inc.php'); $ranking_limit = 5; $sql = sprintf('SELECT T1.A, T1.B FROM `TEST` T1 WHERE T1.B >= (SELECT B FROM `TEST` ORDER BY B DESC LIMIT %d,1) ORDER BY T1.B DESC, T1.A ASC;',$ranking_limit-1); $conn = ADONewConnection('mysql'); # $conn->debug = true; $conn->Connect('host','user','password','db'); $rs = $conn->Execute($sql); $i = 1; $rank = 1; $prev_point = ''; $tmpl = "%d位 %d<br />"; if ($rs) { while ($arr = $rs->FetchRow()) { # var_dump($arr); if ($prev_point == $arr['B']) { printf($tmpl,$rank,$arr['A']); $i++; } else { $rank = $i; printf($tmpl,$rank,$arr['A']); $i++; } $prev_point = $arr['B']; } } ?>
MySQLには、ランク付けといった機能がないので、自前で付ける必要があります。
ランク付けする一例を示すと、下記のようなSQLが考えられます。
select count(*)+1 from tbl1 where B>x.B) as rank, C,B,A from tbl1 as x
さらに、ランクを条件指定したい(5位タイ以下)とのことなので、上記SQLをインラインビューにすることで、インラインビュー内で付けた名前を、外側のクエリで指定可能になります。
select * from (select (select count(*)+1 from tbl1 where B>x.B) as rank, C,B,A from tbl1 as x) as y where rank<=5 order by rank
これをPHPとAdoDBで書くとどうなりますか?