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

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

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

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

SQL

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1574閲覧

SQLでカラムの値によってJOINするテーブルを切り分けたい

meex

総合スコア63

MySQL

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

SQL

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/10/28 14:08

編集2021/10/28 14:09

環境

データベース:MySQL

やりたいこと

■下記のようなテーブルがあります。

<商品マスタ>

商品名商品IDジャンル
タケノコ1野菜
ミカン2果物

<野菜_価格_テーブル>

商品ID価格
11,100
22,200

<果物_価格_テーブル>

商品ID価格
112,100
223,200

この時、「商品マスタ.ジャンル」によって結合するテーブルを切り替えたいです。


完成想定図は以下の通りです。

<結合後のテーブル>

商品マスタ.商品名商品マスタ.商品ID商品マスタ.ジャンル価格テーブル.商品ID価格テーブル.価格
タケノコ1野菜11,100
ミカン2果物223,200

SQL

CASE文がFROM内でも使えると聞き、下記のようにしましたが、エラーとなってしまいました。

■参考サイト:SQLでJOINするカラムを条件分岐させようとした話

SQL

1SELECT * 2FROM `商品マスタ` AS `master` 3LEFT JOIN 4(CASE 5 WHEN `master`.`ジャンル`='野菜' THEN `野菜_価格_テーブル` 6 ELSE `果物_価格_テーブル` 7END) AS `価格テーブル` 8ON `価格テーブル`.`商品ID`=`master`.`商品ID`

どう修正したら、1回のSQLで、かつ、結合先のテーブルを切り分けることができるのでしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

そもそもテーブルを分けてしまったのがネックですね。
下記のようなテーブルにしておけばジャンルと商品IDで結合できました。

<価格テーブル>

ジャンル商品ID価格
野菜11,100
野菜22,200
果物112,100
果物223,100

現状のテーブルのままでいくなら、UNIONで上記のように変換してから、結合ですね。

sql

1SELECT * 2FROM 商品マスタ AS master 3LEFT JOIN 4(SELECT '野菜' AS ジャンル, 商品ID, 価格 5 FROM 野菜_価格_テーブル 6 UNION ALL 7 SELECT '果物' AS ジャンル, 商品ID, 価格 8 FROM 果物_価格_テーブル 9) AS 価格テーブル 10ON 価格テーブル.ジャンル=master.ジャンル AND 価格テーブル.商品ID=master.商品ID 11

投稿2021/10/28 14:35

hatena19

総合スコア33699

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

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

cobm

2021/10/28 14:39

なるほど、価格テーブルまとめた方が良さそうですね。
meex

2021/10/28 20:34

ご回答ありがとうございます。今後、ジャンルが増減した場合に切り離しや追加がしやすいようにという設計思想から、テーブルを分けることとなりました。 しかしながら、分離の仕方によっては結合時にすこし難点があることを知りました。今回はひとまずUNIONで対処する運びに致しましたが、今後のDB設計に活かして行きたく存じます。
guest

0

参考サイトもFROMでCASEを使っていませんし、CASE文がFROM内で使うことは出来なかったかと思います。

必要なテーブルを全てJOINしてから、CASEで参照カラムを分岐させるしかないのかなと。

sql

1 2SELECT `商品マスタ`.`商品名`, 3 `商品マスタ`.`商品ID`, 4 `商品マスタ`.`ジャンル`, 5 (CASE `商品マスタ`.`ジャンル` WHEN '野菜' THEN `野菜_価格_テーブル`.`価格` 6                ELSE `果物_価格_テーブル`.`価格` END) AS `価格テーブル.価格`, 7FROM `商品マスタ` AS `master` 8LEFT JOIN `野菜_価格_テーブル` ON `商品マスタ`.`商品ID`=`野菜_価格_テーブル`.`商品ID` 9LEFT JOIN `果物_価格_テーブル` ON `商品マスタ`.`商品ID`=`果物_価格_テーブル`.`商品ID`; 10

投稿2021/10/28 14:32

cobm

総合スコア239

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

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

meex

2021/10/28 20:31

ご指摘ありがとうございます。間違った知識を修正できました。 CASEの使い方について理解を深めることができました。 今回は都合上、UNIONを使う方式を採用いたしましたが、根本的なDB設計がまずかったことを思い知らされました。次回以降の設計時に活かして行きたく存じます。 ご回答いただけてありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問