裏MySQLクエリー入門(21) 応用編6 ユーザ変数を使ったランキングの順位付け

 ユーザ変数を使う代表例としてランキング系のテーブルで順位表示をしたい場合

以下のようなランキングテーブルを用意します。

CREATE TABLE `ranking` (
`ranking_id`  INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT  'ランキングID',
`category_id` INT NOT NULL COMMENT  'カテゴリーID',
`point`       INT NOT NULL COMMENT  'ポイント'
) ENGINE = MYISAM COMMENT =  'ランキングテーブル';
INSERT INTO `ranking` 
(`category_id` ,`point`) 
VALUES 
('1',   '38'),('2',   '74'),('3',   '13'),
('1',  '125'),('1',    '1'),('3',    '8'),
('1',   '27'),('2',   '22'),('2',   '44');
ranking_id category_id point
1 1 38
2 2 74
3 3 13
4 1 125
5 1 1
6 3 8
7 1 27
8 2 22
9 2 44

単純に順位を付けるだけなら

SET @R:=0;
SELECT
  @R:=@R+1 rank  ,
  category_id    ,
  ranking_id     ,
  point 
FROM ranking 
ORDER BY point
rank category_id ranking_id point
1 1 5 1
2 3 6 8
3 3 3 13
4 2 8 22
5 1 7 27
6 1 1 38
7 2 9 44
8 2 2 74
9 1 4 125

ちょっと複雑にして、カテゴリー毎に順位を付けたい場合

SET @R=0,@C=0;
SELECT
  @R:=IF(@C=category_id,@R+1,1) rank   ,
  @C:=`category_id` category_id,
  `ranking_id`                                 ,
  `point`
FROM ranking
ORDER BY category_id,point
rank category_id ranking_id point
1 1 5 1
2 1 7 27
3 1 1 38
4 1 4 125
1 2 8 22
2 2 9 44
3 2 2 74
1 3 6 8
2 3 3 13