もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

mysql8のwindow関数(ROW_NUMBER)

はじめに

こんばんは。

簡単な備忘録ですが、 初めて使用してみたので、ブログに残しておきます。

mysql8のwindow関数のROW_NUMBERを試してみました。

今まで使ってなかったのか。。。という話ですが。

本題

テストテーブル作成

CREATE TABLE `test_users` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'メールアドレス',
  `name` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'パスワード',
  PRIMARY KEY (`id`)
);


CREATE TABLE `test_orders` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) unsigned NOT NULL COMMENT 'ユーザーID',
  `fee` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '料金',
  PRIMARY KEY (`id`)
);

テストデータ作成

select * from test_users;
+----+-------------------+--------+
| id | email             | name   |
+----+-------------------+--------+
|  1 | test_01@gmail.com | test01 |
|  2 | test_02@gmail.com | test02 |
|  3 | test_03@gmail.com | test03 |
|  4 | test_04@gmail.com | test04 |
|  5 | test_05@gmail.com | test05 |
+----+-------------------+--------+



select * from test_orders;
+----+---------+-------+
| id | user_id | fee   |
+----+---------+-------+
|  1 |       1 |  2000 |
|  2 |       1 |   500 |
|  3 |       1 |  4000 |
|  4 |       1 |  1000 |
|  5 |       1 |  1000 |
|  6 |       2 |   800 |
|  7 |       1 |  1000 |
|  8 |       4 |   200 |
|  9 |       2 | 10000 |
| 10 |       1 |  3000 |
| 11 |       1 |  2000 |
| 12 |       3 |  4000 |
| 13 |       2 |  1090 |
| 14 |       5 |   200 |
+----+---------+-------+

使用例

例えば、各ユーザーがそれぞれ何回注文したかみたいなのをとれたりします。

SELECT u.id, u.email, ROW_NUMBER() OVER (PARTITION BY u.id) AS 'row_count' FROM test_orders AS o JOIN test_users AS u ON (o.user_id = u.id);
+----+-------------------+-----------+
| id | email             | row_count |
+----+-------------------+-----------+
|  1 | test_01@gmail.com |         1 |
|  1 | test_01@gmail.com |         2 |
|  1 | test_01@gmail.com |         3 |
|  1 | test_01@gmail.com |         4 |
|  1 | test_01@gmail.com |         5 |
|  1 | test_01@gmail.com |         6 |
|  1 | test_01@gmail.com |         7 |
|  1 | test_01@gmail.com |         8 |
|  2 | test_02@gmail.com |         1 |
|  2 | test_02@gmail.com |         2 |
|  2 | test_02@gmail.com |         3 |
|  3 | test_03@gmail.com |         1 |
|  4 | test_04@gmail.com |         1 |
|  5 | test_05@gmail.com |         1 |
+----+-------------------+-----------+

終わりに

自分が使用したことがあるものだけなので、簡単ですがこれだけです...w ROW_NUMBER以外にも使用するときが出てくると思うので、その時にまたブログに残そうと思います。