はじめに
こんばんは。
簡単な備忘録ですが、 初めて使用してみたので、ブログに残しておきます。
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以外にも使用するときが出てくると思うので、その時にまたブログに残そうと思います。