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

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

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

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

Q&A

解決済

1回答

497閲覧

MySQLでの中間テーブルを用いた集計方法について

AkiraSonoda

総合スコア30

MySQL

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

0グッド

0クリップ

投稿2022/07/20 12:58

前提

中間テーブルを用いたDBの集計をしたいのですがどうやれば上手くいくのかわからないため質問させていただきます。投稿が慣れていないため、内容に間違いがあればご指摘ください。
DBはMySQLを使用しています。

テーブル構成は以下3つの通りです。

TABLE1(親テーブル)

1CREATE TABLE TABLE1 ( 2 user_id int primary key auto_incriment not null, 3 name varchar(10) not null 4);

EAT_LIST(食べ物番号一覧)

1CREATE TABLE EAT_LIST ( 2 eat_id int primary key auto_incriment not null, 3 eat_name varchar(30) not null 4); 5 6INSERT INTO EAT_LIST (eat_id, eat_name) VALUES 7(1, 'ラーメン'), 8(2, 'うどん'), 9(3, 'そば');

EAT_MID(食べ物番号の中間テーブル)

1CREATE TABLE EAT_MID ( 2 id int primary key auto_incriment not null, 3 user_id int not null, 4 eat_id int not null 5); 6 7INSERT INTO EAT_MID (eat_id, eat_name) VALUES 8(1, 1, 1), 9(2, 1, 2), 10(3, 2, 3), 11(4, 3, 1);

実現したいこと

以下のイメージでデータ集計がしたいです。
ユーザIDが1の人はEAT_MIDテーブルにラーメンとうどんのデータがあるので1を立てる。そばはないのでnullとする。
ユーザIDが2の人はそばに1、それ以外はnull
・・・のような感じです。

user_id | ラーメン | うどん | そば 1 | 1 |1 | null 2 | null | null | 1 3 | 1 | null | null

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

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

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

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

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

guest

回答1

0

ベストアンサー

TABLE1にはEAT_MIDに登録されていないユーザがいる前提とします (TABLE1にはラーメン、うどん、そばのいずれも食べていないユーザが登録されている)

やり方はいろいろありそうですが、個人的にはサブクエリを利用する方法が好みです。

SQL

1SELECT 2 A.user_id, 3 CASE WHEN (SELECT COUNT(*) FROM EAT_MID B WHERE A.user_id = B.user_id AND B.eat_id = 1) > 0 THEN 1 END AS ラーメン, 4 CASE WHEN (SELECT COUNT(*) FROM EAT_MID B WHERE A.user_id = B.user_id AND B.eat_id = 2) > 0 THEN 1 END AS うどん, 5 CASE WHEN (SELECT COUNT(*) FROM EAT_MID B WHERE A.user_id = B.user_id AND B.eat_id = 3) > 0 THEN 1 END AS そば 6FROM TABLE1 A;

あるいはJOINとGROUP BYを組み合わせる方法もあります。

SQL

1SELECT 2 A.user_id, 3 MAX(B.eat_id = 1) = 1 OR NULL AS ラーメン, 4 MAX(B.eat_id = 2) = 1 OR NULL AS うどん, 5 MAX(B.eat_id = 3) = 1 OR NULL AS そば 6FROM TABLE1 A 7LEFT OUTER JOIN EAT_MID B ON A.user_id = B.user_id 8GROUP BY A.user_id

投稿2022/07/20 14:57

neko_the_shadow

総合スコア2225

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

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

AkiraSonoda

2022/07/20 15:30

早々に回答ありがとうございます。 まさにこれがやりたいことでした。 私もサブクエリの方が好みでした。
sazi

2022/07/21 01:13

@AkiraSonoda さん 実行計画を確認した上でどちらの方法を取られるか決めた方が良いですよ。 処理するデータが大量なら、概ね後者の方が高速になるかと思いますので。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問