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

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

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

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

Q&A

3回答

753閲覧

mysqlでテーブルに二つのIDを保持しているIDを取得する方法

shogo_misaki

総合スコア13

MySQL

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

0グッド

0クリップ

投稿2017/10/04 11:51

下記のテーブルがあるとします。

table

product_id|category_id
1     |1
1     |2
2     |1
2     |4
3     |2
3      |4
4     |1
4     |2

上記テーブルで、category_idが1と2であるproduct_idを取得するsqlが知りたいです。
上記例であれば1と4が取得するにはどのようなsql文を記載すべきなのでしょうか。

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

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

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

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

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

guest

回答3

0

こうですね

SQL

1select product_id from tbl 2where category_id in (1,2) 3group by product_id 4having count(distinct category_id)=2

sample 追記

以下で試してみるとよいでしょう。

SQL

1create table tbl(product_id int,category_id int); 2insert into tbl values(1,1),(1,2),(2,1),(2,4),(3,2),(3,4),(4,1),(4,2),(1,2),(5,1),(5,1);
  • product_id=1はcategory_id、1,2,2を持ち通常にカウントすると3ですがヒットします
  • product_id=5はcategory_id、1,1を持ち2を持ちません、通常にカウントすると2ですがヒットしません

投稿2017/10/05 00:31

編集2017/10/05 01:12
yambejp

総合スコア114779

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

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

sazi

2017/10/05 01:04 編集

category_idとproduct_idでユニークであるならですね。 ユニークでない場合まで考慮したら、もう1階層ネストが必要。
yambejp

2017/10/05 01:04

いや、あってませんか?
sazi

2017/10/05 01:08

サンプルで見るならあっています。 でも、キー情報の提示が無いし、キーは別にあるテーブルのそのカラムだけを抜粋したものかもしれないので、前提条件が必要かと。
sazi

2017/10/05 01:12 編集

あ、失礼しました。 count()内でdistinctしてましたね。 じゃあ、これが一番効率良さそうですね。
yambejp

2017/10/05 01:14

saziさん、了解しました 一応sample追記しておきました
guest

0

SQL

1select distinct t1.product_id 2from `table` as t1 inner join `table` as t2 3 on t1.product_id=t2.product_id 4 and t1.category_id=1 and t2.category_id=2

または、

SQL

1select distinct product_id from `table` 2where product_id in (select product_id from `table` where category_id=1) 3 and product_id in (select product_id from `table` where category_id=2)

それぞれ、distinct の代わりに group by でも可

投稿2017/10/04 15:45

sazi

総合スコア25173

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

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

0

下記のように取得できないでしょうか。

SQL

1SELECT product_id FROM `table` GROUP BY product_id 2HAVING GROUP_CONCAT(DISTINCT category_id ORDER BY category_id) = '1,2';

追記:
IDの組み合わせがユニークであるという前提は確かに記載されていませんでしたので、DISTINCT指定を追加しました。
主キーやユニークキーになっているなど各IDの組み合わせが一意に定まっているのあれば、DISTINCTは不要かと思います。

投稿2017/10/04 12:00

編集2017/10/05 10:19
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問