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

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

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

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

Q&A

解決済

4回答

478閲覧

SQLの質問です。複数のカテゴリを持つ単一商品の画像URLを取得したいのですがうまくいきません。

tao

総合スコア1

MySQL

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

0グッド

1クリップ

投稿2022/06/29 18:45

下記のようなテーブル構造でカテゴリが1でもあり2でもある商品の商品画像URLを取得したいのですがうまく行きません。SQLについてスキルが乏しく色々と試したのですが思う結果にならずお力をお借りできればと思います。

商品テーブル

商品IDカテゴリ
1001
1002
2001
2003
3002
3003
4001
4002

商品画像テーブル

商品画像URL
100URL1
200URL2
300URL3
400URL4

上記のテーブル構造でカテゴリが1、2どちらにあてはまる100と400の商品画像テーブルの下記の結果が得られれば良いのですが、どうぞよろしくお願い致します。

100URL1
400URL4

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

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

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

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

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

BeatStar

2022/06/29 22:14

あまり使い慣れていませんけど、一旦group by句でグルーピングしてそれを全体集合として再度検索する感じになると思います。
CHERRY

2022/06/29 22:16

試した SQL 文と結果を質問に追記していただけないでしょうか。
退会済みユーザー

退会済みユーザー

2022/06/30 02:49 編集

どちらかに、どちらにも、どっちにも受け取れる曖昧な表現はよくない。「カテゴリが1、2どちらにあてはまる」「100と400の」はand条件ってことなのかな?
yambejp

2022/06/30 00:22 編集

1,2,3が設定されているデータがある場合はどうしたいのでしょうか? 1,1や1,1,2などの場合はありますか?
tao

2022/06/30 02:21

皆様、ご指導いただきありがとうございます。 CHERRY様 まず試したSQLですが、サブクエリもまともに理解できていたに状態で、エラーで実行できないか、0件表示などわけもわからず色々といじった状況で追記できる状況ではありません。本当にスキル不足で申し訳ありません。 yambejp様 カテゴリは1、2、3など1、2以外が設定されいることはあります。 ただし同一の商品IDで同じカテゴリをもっているデータはありません。 sPy2bUDOZ4uRa7t様 ご指摘頂いているあいまいな表現がどこかもわからないスキルです。 前任者から素人状態で受け取り手探りで1日ぐらい悩んで質問させて頂きました。 これからスキルを上げて行きたいと思います。 ご指導ありがとうございます。
BeatStar

2022/06/30 02:36

@ 質問者さん 横からになりますが、 > エラーで実行できないか、0件表示などわけもわからず色々といじった状況で追記できる状況ではありません とありますね。それについて書きますが、そういう場合は「実際に試したこと」(SQL文等も含む)と「その結果」をそれぞれ書いたほうがいいですよ。 というのも、エラーメッセージは単にできなかっただけではなく、MySQL等からのメッセージです。 メッセージにヒントが隠されています。 それに「試したこと」がかかれていないいと、回答者からすると回答しづらいのです。別に質問者に完璧さを求めていません。できないから質問するのであって、答えそのものを知っているのなら聞く必要がないからです。 質問者がわからないからと馬と鹿にする回答者はいません。 課題丸投げとかは別ですが。 今回のような場合はまだいいですがものによっては質問者さんの技量がわからないと回答の仕様がない場合もありますよ。単に「grepして○○して…すればいい」と曖昧な表現でもいいのなら構いませんが、大体の場合は細かく説明されないと理解できないことが多いです。 それなのにその人の技量がわかるような質問文でないならまともな回答のしようがないのです。 そういったことから、次回からは「試したこととその結果」をそれぞれ書きましょう。二つ試したなら2種類、三つ試したなら3種類書きましょう。
tao

2022/06/30 04:37

BeatStar様 ご回答ありがとうございます。 全くもってご指摘の通りです。やりたいことは具体的に描いたつもりですが、足りない部分は皆さまのご指摘により学習できました。自分でやったことや試したこと、エラー内容は残すように取り組ませて頂きます。わけもわからず色々なページを読み漁り適当に丸一日以上いじっていて途方に暮れて、こちらに甘えてしまいました。 皆様のお時間やお知恵をお借りしたこと無駄にしないよう取り組みさせて頂きます。 BeatStar様のお時間頂いたことにも感謝いたします。
guest

回答4

0

2回joinするのはどうでしょう。

SQL

1SELECT 2 商品, URL 3FROM 4 商品画像テーブル 5 JOIN 商品テーブル AS c1 ON 商品画像テーブル.商品=c1.商品ID 6 JOIN 商品テーブル AS c2 ON 商品画像テーブル.商品=c2.商品ID 7WHERE 8 c1.カテゴリ=1 AND c2.カテゴリ=2 9;

投稿2022/06/30 01:18

編集2022/06/30 01:19
bsdfan

総合スコア4571

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

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

tao

2022/06/30 02:27

ご回答ありがとうございます。頂いたSQLの内容ですがじっくり理解しながら試したいと思います。 他の方から頂いた方法で考えていた結果が出ましたので、時間をとり理解できるように取り組ませて頂きます。
tao

2022/06/30 21:59

考えながら動かしてみました。期待通りの結果が出ました。ありがとうございます。 自分で考えつくようにしたいと思いますので今後ともよろしくお願い致します。
guest

0

IDとカテゴリーの組み合わせがユニークで、1,2以外のものがあってもヒットしていいならこんな感じ

SQL

1create table tbl (id int, category int,unique(id,category)); 2insert into tbl values 3(100, 1), 4(100, 2), 5(200, 1), 6(200, 3), 7(300, 2), 8(300, 3), 9(400, 1), 10(400, 2), 11(500, 1), 12(500, 2), 13(500, 3); 14select id from tbl 15group by id 16having sum(category in (1,2))=2;

投稿2022/06/30 00:48

yambejp

総合スコア114843

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

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

tao

2022/06/30 02:28

ご回答ありがとうございます。 1,2以外があってもよいので頂いたSQLの内容をじっくり理解しながら試したいと思います。 他の方から頂いた方法で考えていた結果が出ましたので、時間をとり理解できるように取り組ませて頂きます。
tao

2022/06/30 22:11

考えながら動かしてみました。期待通りの結果が出ました。ありがとうございます。 自分で考えつくようにしたいと思いますので今後ともよろしくお願い致します。
guest

0

カテゴリが1、2どちらにあてはまる100と400の

まで。

sql

1drop table sss; 2create table sss (id int, cat int); 3insert into sss values 4 (100, 1), 5 (100, 2), 6 (200, 1), 7 (200, 3), 8 (300, 2), 9 (300, 3), 10 (400, 1), 11 (400, 2) 12;

sql

1select id from sss where cat = 1 2intersect 3select id from sss where cat = 2 4;
100 400

投稿2022/06/29 23:49

shiketa

総合スコア3971

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

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

tao

2022/06/30 02:32

ご回答ありがとうございます。 他の方から頂いた案で考えていた結果が出ました。 理解しながら進めますので時間がかかりますが、こちらも試して結果をご報告いたします。
tao

2022/06/30 22:35

考えながら進めましたが、INTERSECTはMYSQLではサポートされていませんでした。 ただしINTERSECT【積集合】という言葉の意味が理解できたこと、INTERSECTをMYSQLで実装するための数々の解説ページにより理解が非常に深まりました。考え方として一番の回答かと存じます。今後ともよろしくお願い致します。
guest

0

ベストアンサー

SQL

1select * from 商品画像 2where exists(select 1 from 商品 where 商品ID=商品画像.商品 and カテゴリ=1) 3 and exists(select 1 from 商品 where 商品ID=商品画像.商品 and カテゴリ=2)

または

SQL

1select * from 商品画像 2where 商品 in ( 3 select 商品ID from 商品 4 where カテゴリ in (1, 2) 5 group by 商品ID 6 having count(distinct カテゴリ)=2 7 )

投稿2022/06/30 00:48

sazi

総合スコア25195

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

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

tao

2022/06/30 02:25

最初に頂いたexistsの文で試したところ、考えていた結果が出ました。 こちらは何となくですが理解できる範囲です。ありがとうございます。 第2案も理解しながら、試させて頂きます。
tao

2022/06/30 23:39

第2案もうまく動作致しました。本当にありがとうございます。 existsの方は私の環境でクエリの実行時間: 11.0662 秒 in+havingではクエリの実行時間: 0.0574 秒と大きな違いがありました。 今回は実作業ではexistsで1回出力すれば良かったので大変助かりました。 実務で定例作業にはin+havingで組み込みます。 どちらも使いこなせるように理解を深めたいと思っております。 単純な質問と思いましたがsazi様や他の方の考え方など、すごく参考になりました。 今回あいまいな低レベルの質問で失礼しましたが、思い切って質問してよかったです。 皆様ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問