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

以下のようなデータがテーブル(TEST)にあった際に
ランキング用データを取得したいのですが
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

以上、宜しくお願い致します。

●質問者: hopefully
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:0系 501 801 SQL test
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● Leclerc
●23ポイント

存在しないデータがあるので、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

◎質問者からの返答

これをPHPとAdoDBで書くとどうなりますか?


2 ● Leclerc
●23ポイント

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件だけしかもって来ませんよね?

それとも同位の場合は可能でしょうか?


3 ●
●22ポイント

以下のようなイメージでしょうか。

(表示部分はもうちょっとマシなやり方があった気がしますが。)

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

?>

4 ● chuken_kenkou
●22ポイント

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
関連質問


●質問をもっと探す●



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