2015年5月31日日曜日

SELECT文による順位付け


# テスト用のテーブル作成
CREATE TABLE `ranking` (
  `user_id` int(11) NOT NULL DEFAULT '0',
  `score`   int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

# テスト用のデータ作成
INSERT INTO
  ranking(user_id, score)
VALUES
  (1,1213),
  (2,10233),
  (3,143023),
  (4,12013),
  (5,12510013),
  (6,12003),
  (7,120163),
  (8,103123),
  (9,103123);


# 順位付けのSELECT文
# サブクエリで、メインクエリのscore値より大きいレコード数+1 をランクとして抽出しています。
SELECT
  user_id,
  score,
  (SELECT COUNT(*) +1 FROM ranking SUB WHERE MAIN.score < SUB.score) AS rank
FROM
  ranking MAIN
ORDER BY
  rank, user_id
;



# 出力結果
+---------+----------+------+
| user_id | score    | rank |
+---------+----------+------+
|       5 | 12510013 |    1 |
|       3 |   143023 |    2 |
|       7 |   120163 |    3 |
|       8 |   103123 |    4 |
|       9 |   103123 |    4 |
|       4 |    12013 |    6 |
|       6 |    12003 |    7 |
|       2 |    10233 |    8 |
|       1 |     1213 |    9 |
+---------+----------+------+

0 件のコメント:

コメントを投稿