質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

1051閲覧

SQLのSELECTで外部テーブルを非正規化して表示

matsubokkuri

総合スコア751

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2020/04/30 13:42

以下のようなスキーマにおいて、

sql

1CREATE TABLE `orders` ( 2 `id` bigint(20) NOT NULL AUTO_INCREMENT, 3 `code` varchar(255) NOT NULL, 4 PRIMARY KEY (`id`) 5); 6CREATE TABLE `order_products` ( 7 `id` bigint(20) NOT NULL AUTO_INCREMENT, 8 `order_id` bigint(20) NOT NULL, 9 `name` varchar(255) NOT NULL, 10 PRIMARY KEY (`id`), 11 CONSTRAINT `fk_orders` FOREIGN KEY (`order_id`) REFERENCES `orders` (`id`) 12);

以下のようなデータが入っているときに、

sql

1INSERT INTO orders (id, code) VALUES(1, 'aaa'); 2INSERT INTO order_products (id, order_id, name) VALUES(1, 1, 'product a'); 3INSERT INTO order_products (id, order_id, name) VALUES(2, 1, 'product b'); 4INSERT INTO order_products (id, order_id, name) VALUES(3, 1, 'product c'); 5 6> select * from orders; 7+----+------+ 8| id | code | 9+----+------+ 10| 1 | aaa | 11+----+------+ 12 13> select * from order_products; 14+----+----------+-----------+ 15| id | order_id | name | 16+----+----------+-----------+ 17| 1 | 1 | product a | 18| 2 | 1 | product b | 19| 3 | 1 | product c | 20+----+----------+-----------+ 21

以下のように子テーブルを非正規化して、親のレコード1行に対して子供のとあるカラムを非正規化して抽出することは可能でしょうか?

sql

1+----+------+---------------------------------+ 2| id | code | denormalization | 3+----+------+---------------------------------+ 4| 1 | aaa | product a, product b, product c | 5+----+------+---------------------------------+

変な要求かもしれませんが、親のレコード単位で集計しつつ、子供の値も予備情報として出力したいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

ordersのcodeでユニークが保証されているかどうか分からないので、idは最小値
order_productsには同じ(order_id, name)の組合せがあるでしょうから、DISTINCTで纏める。

SQL

1select min(orders.id) as id 2 , orders.code 3 , group_concat(distinct order_products.name order by order_products.name) as denormalization 4from orders 5 left join order_products 6 on orders.id = order_products.order_id 7group by orders.code

投稿2020/04/30 15:01

編集2020/05/01 01:22
sazi

総合スコア25206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

matsubokkuri

2020/05/01 00:22 編集

group_concat知らなかったです!便利! ``` > select min(orders.id) as id -> , orders.code -> , group_concat(distinct order_products.name order by order_products.name) as denormalization -> from orders -> left join order_products -> on orders.id = order_products.order_id -> group by orders.id -> ; +------+------+-------------------------------+ | id | code | denormalization | +------+------+-------------------------------+ | 1 | aaa | product a,product b,product c | +------+------+-------------------------------+ 1 row in set (0.00 sec) ```
sazi

2020/05/01 01:23

Group By項目が間違っていましたので訂正しました。
guest

0

SELECT ... JOIN ... で複数のテーブルからSELECTするのも含めて、以下のURLをよーく見ていただくとして、MySQLはGROUP_CONCAT で横に並べます。

投稿2020/04/30 14:30

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

sql

1select 2 O.id, 3 O.code, 4 group_concat(P.name) as denormalization 5from orders O 6left join order_products P on O.id = P.order_id 7group by O.id

投稿2020/04/30 14:18

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問