以下のようなデータがテーブル(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

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

回答の条件
  • 1人5回まで
  • 登録:2007/12/09 04:57:45
  • 終了:2007/12/16 05:00:06

回答(4件)

id:Leclerc No.1

Leclerc回答回数86ベストアンサー獲得回数62007/12/09 10:24:15

ポイント23pt

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

id:hopefully

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

2007/12/10 00:53:37
id:Leclerc No.2

Leclerc回答回数86ベストアンサー獲得回数62007/12/10 01:19:55

ポイント23pt

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();
	}
}

こんな感じでどうでしょう。

id:hopefully

下のやつだと5件だけしかもって来ませんよね?

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

2007/12/10 01:59:48
id:bonlife No.3

回答回数421ベストアンサー獲得回数752007/12/10 12:27:36

ポイント22pt

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

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

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

?>
id:chuken_kenkou No.4

chuken_kenkou回答回数722ベストアンサー獲得回数542007/12/11 02:41:53

ポイント22pt

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

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

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

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

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

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