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

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

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

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

Q&A

解決済

4回答

2784閲覧

mysql 多対多リレーション時のデータ呼び出しについて

web_yasu

総合スコア16

MySQL

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

0グッド

1クリップ

投稿2016/12/22 02:24

mysql 多対多リレーション時のデータ呼び出しについて質問いたします。

以下のような構造になっていたとします。

###table1(料理)

-------------------------------- | table1_id | table1_name | -------------------------------- | 1 | オムレツ | -------------------------------- | 2 | オムライス | -------------------------------- | 3 | チキンライス | --------------------------------

###table12(中間テーブル)

-------------------------------- | table1_id | table2_id | -------------------------------- | 1 | 1| -------------------------------- | 1 | 2 | -------------------------------- | 2 | 1 | -------------------------------- | 2 | 2 | -------------------------------- | 2 | 3 | -------------------------------- | 3 | 2 | -------------------------------- | 3 | 3 | --------------------------------

###table2(食材)

-------------------------------- | table2_id | table2_name | -------------------------------- | 1 | タマゴ | -------------------------------- | 2 | ケチャップ | -------------------------------- | 3 | ご飯 | --------------------------------

###以下のようにJOINしています。

SELECT * FROM `table1` AS `t1` LEFT JOIN `table12` AS `t12` ON `t12`.`table1_id` = `t1`.`table1_id` LEFT JOIN `table2` AS `t2` ON `t2`.`table2_id` = `t12`.`table2_id` GROUP BY `t1`.`table1_id`

以下を条件のセレクト文はどのように記述すればよいのでしょうか?

質問1.タマゴ OR ケチャップ を使用している料理

**質問2.タマゴ AND ケチャップ **を使用している料理

よろしくお願いいたします。

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

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

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

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

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

yambejp

2016/12/22 02:30

「タマゴ」や「ケチャップ 」で検索するのは名称を利用するのでしょうか?それともidを指定していいのでしょうか?
web_yasu

2016/12/22 02:38

idを指定大丈夫です。
guest

回答4

0

ベストアンサー

以下例示します
元データ

SQL

1create table ryouri(rid int not null primary key,name varchar(20)); 2insert into ryouri values(1,'オムレツ'),(2,'オムライス'),(3,'チキンライス'),(4,'お茶漬け'); 3 4create table shokuzai(sid int not null primary key,name varchar(20)); 5insert into shokuzai values(1,'タマゴ'),(2,'ケチャップ'),(3,'ご飯'); 6 7create table relation_r_s(rid int,sid int,unique(rid,sid)); 8insert into relation_r_s values(1,1),(1,2),(2,1),(2,2),(2,3),(3,2),(3,3),(4,3);

考え方

  • リレーションテーブルにおいてridに食材が何種類使われているか検証
select rid,count(*) from relation_r_s group by rid
  • タマゴとケチャップで絞り込む
select rid,count(*) from relation_r_s where sid in (1,2) group by rid

条件:

  • タマゴorケチャップはcount(*)>0
  • タマゴandケチャップはcount(*)=2
  • タマゴ、ケチャップどちらか一つならcount(*)=1

したがってhavingを使って

SQL

1/*タマゴorケチャップ*/ 2select * from ryouri 3where rid in( 4select rid from relation_r_s 5where sid in (1,2) 6group by rid 7having count(*)>0 8); 9 10/* タマゴandケチャップ */ 11select * from ryouri 12where rid in( 13select rid from relation_r_s 14where sid in (1,2) 15group by rid 16having count(*)=2 17); 18

投稿2016/12/22 02:54

yambejp

総合スコア114769

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

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

web_yasu

2016/12/22 03:32

クリエイト文まで作成いただいており、テストデータのお茶漬けまで。 考え方が箇条書きにされていて分かりやすかったです。 回答ありがとうございました。ベストアンサーにさせていただきます。
guest

0

質問1.タマゴ OR ケチャップ を使用している料理

sql

1select distinct table1_name from table1 join table12 using(table1_id) 2 join table2 using(table2_id) where table2_name in ('タマゴ','ケチャップ');

質問2.タマゴ AND ケチャップ を使用している料理

sql

1select distinct table1_name from (select table1_id, table1_name from table1 2 join table12 t12 using(table1_id) join table2 t2 on t12.table2_id=t2.table2_id 3 and t2.table2_name='ケチャップ') t10 4join (select table1_id from table1 join table12 t12 using(table1_id) 5 join table2 t2 on t12.table2_id=t2.table2_id 6 and t2.table2_name='タマゴ') t11 using(table1_id);

投稿2016/12/22 03:11

編集2016/12/22 03:50
A.Ichi

総合スコア4070

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

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

web_yasu

2016/12/22 03:38

「質問2.タマゴ AND ケチャップ」のJOINが増えていく考え方も参考になりました。データが多くなった状況で他の方法と比べてみたいと思いました。 回答ありがとうございました。
guest

0

料理がとれればいいということで、とりあえず最後の SELECT 文は無視しておきます。

質問1 は

SQL

1SELECT DISTINCT table1.table1_id, table1.table1_name 2FROM table1 INNER JOIN table12 ON (table12.table1_id = table1.id) 3INNER JOIN table2 ON (table2.id = table12.table2_id) 4WHERE table2.table2_id in (1, 2);

でいいですね。

質問2 はちょっと面倒ですが、「table12で、条件に合う食材の件数をID毎にカウントして、そのカウント数が食材の総数と一致するtable1_id を抽出」できればいいはずです。

SQL

1SELECT table1.table1_id, table1.table1_name 2FROM table1 INNER JOIN ( 3 SELECT table1_id FROM table12 WHERE table2_id IN (1,2) 4 GROUP BY table1_id 5 HAVING count(*)=2 6) vt1 ON (table1.table1_id = vt1.table1_id)

投稿2016/12/22 02:51

編集2016/12/22 03:07
tacsheaven

総合スコア13703

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

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

web_yasu

2016/12/22 03:27

「table12で、条件に合う食材の件数をID毎にカウントして、そのカウント数が食材の総数と一致するtable1_id を抽出」 という考え方で応用できそうです。 回答ありがとうございました。
guest

0

idでいいなら

select distinct table1_id from table12 where table2_id=1 and(or) table2_id=2

投稿2016/12/22 02:54

katsuya141

総合スコア367

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

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

web_yasu

2016/12/22 03:28

回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問