ユーザ変数を使う代表例としてランキング系のテーブルで順位表示をしたい場合
以下のようなランキングテーブルを用意します。
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 |