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

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

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

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

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

Q&A

解決済

2回答

466閲覧

Mysql 条件によって接続するテーブルを分岐したい

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

0グッド

0クリップ

投稿2022/12/01 07:54

編集2022/12/04 12:51

元テーブル
データID 顧客ID

接続1テーブル
データID 顧客ID メモ

接続2テーブル
データID  メモ

以上の三つのテーブルがあり、
ほしい結果は
データID 顧客ID  メモ
です。

元.データID = 接続1.データID AND 元.顧客ID = 接続1.顧客ID ※
が優先され、それに当てはまらなかったレコードのみ(顧客IDが接続1に存在しない)
元.データID = 接続2.データID ※※
の接続がしたいです。

UNIONクエリで1と2を縦に接続すればいいかと思いましたが
1と2のデータIDには重複があり、メモの内容も違います。

CASE文で接続データを分岐するのだと思いますが
※の結果がなかった時に※※とする分岐方法がわかりませんでした。

追記
多くの方から質問の仕方に対するご指摘いただきましてありがとうございました。
質問の内容があいまいだったと反省しております。
テーブル定義とサンプルデータ、出したいSELECT文のイメージを申し上げます。

以下の三つのテーブルがある

元テーブル

CREATE TABLE 元テーブル( 連番id INT(11) AUTO_INCREMENT NOT NULL, データID VARCHAR(30) NOT NULL, 顧客ID VARCHAR(30) NOT NULL, PRIMARY KEY (連番id) );

元テーブルのデータ

INSERT INTO `元テーブル` (`連番id`, `データID`, `顧客ID`) VALUES (NULL, '501', '101'), (NULL, '502', '101'), (NULL, '601', '102'), (NULL, '602, '102'), (NULL, '701', '103'), (NULL, '702', '103');

テーブル1

CREATE TABLE 接続1テーブル( 連番id INT(11) AUTO_INCREMENT NOT NULL, データID VARCHAR(30) NOT NULL, 顧客ID VARCHAR(30) NOT NULL, MEMO VARCHAR(30) NOT NULL, PRIMARY KEY (連番id ) );

テーブル1のデータ

INSERT INTO `接続1テーブル` (`連番id`, `データID`, `顧客ID`, `MEMO`) VALUES (NULL, '501', '101', '101顧客専用501'), (NULL, '601', '102', '102顧客専用601');

テーブル2

CREATE TABLE 接続2テーブル( 連番id INT(11) AUTO_INCREMENT NOT NULL, データID VARCHAR(30) NOT NULL, MEMO VARCHAR(30) NOT NULL, PRIMARY KEY (連番id ) );

テーブル2のデータ

INSERT INTO `接続2テーブル` (`連番id`, `データID`, `MEMO`) VALUES (NULL, '501', 'メモ501'), (NULL, '502', 'メモ502'), (NULL, '601', 'メモ601'), (NULL, '602', 'メモ602'), (NULL, '701', 'メモ701'), (NULL, '702', 'メモ702');

求めたい結果
|顧客ID|データID|メモ|
|:101|:501|:101顧客専用501:|
|:101|:502|:メモ502:|
|:102|:601|:102顧客専用601:|
|:102|:602|:メモ602:|
|:103|:701|:メモ701:|
|:103|:702|:メモ702:|

元テーブル.データIDをテーブル1.データID外部結合し、顧客ID、データID、メモの結果を出したいのですが
顧客IDがテーブル1に存在しないときに結合先を元テーブル.データIDとテーブル2.データIDに変更したいのです。

dameo様のおっしゃる「3つの表を一気に外部結合した上で、接続1、接続2どちらか一方がNULLでないという条件で行を抽出、さらにSELECT句でCASEを使ってメモを優先順位どおりに出せばいいのかなと思います。」というのが解なのかな?といま検討中ですが、能力不足でまだそのヒントを生かせておりません。
もうしばらく考えるお時間を頂きたいと思います。

皆様、お時間を割いていただいてありがとうございます。

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

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

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

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

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

yambejp

2022/12/01 08:23

具体的なサンプルを例示ください
Orlofsky

2022/12/01 08:41

質問は修正できます。 この掲示板ではテーブル定義はCREATE TABLE文で、サンプル・データはINSERT文で、現行で書けるだけでもSQL文を https://teratail.com/help/question-tips#questionTips37 の [コード] を使って提示してください。
dameo

2022/12/01 18:10

テーブル定義、サンプルデータもある方がいいです。ただ、「の接続がしたいです。」だけでは何がしたいのか分かりません。ようは元テーブルと接続1テーブルを接続(JOIN)して、さらに接続2テーブルも接続(JOIN)したいという話なのですよね? この接続(JOIN)は恐らく内部結合(INNER JOIN)を仮定しているのだと思いますが、すると重複データしか取れません。困るので元テーブルと接続1テーブルを接続(INNER JOIN)したものと、元テーブルと接続2テーブルを接続(INNER JOIN)したものを縦に結合(UNION)したけど、今度は恐らく(データID,顧客ID)の組に重複があり、1行で出力すべきデータ(優先すべき方のみにする)が2行になってしまい(本来なら出力しない方も出てしまう)困ってしまったという話なのかと思います。 もしそういう話なら、多分内部結合ではなく、外部結合(OUTER JOIN)を使用する方法はどうでしょう?3つの表を一気に外部結合した上で、接続1、接続2どちらか一方がNULLでないという条件で行を抽出、さらにSELECT句でCASEを使ってメモを優先順位どおりに出せばいいのかなと思います。
m.ts10806

2022/12/01 21:55 編集

>(初心者) 質問には「初心者アイコン」がつけられたはずなので、わざわざ書く必要はないです。 ただ、現状だと「例」だけで丸投げされている状態なので、具体的なアドバイスにはなり得ないと思います。 既に指摘されていることも含めて質問編集してご対応ください。
退会済みユーザー

退会済みユーザー

2022/12/04 13:20

回答・質問コメント頂きありがとうございました。 皆様のご指摘を受けてあいまいな質問内容、質問の仕方であったこと気づかされました。 お恥ずかしい限りです。今後に生かそうと思います。 問題を整理して、一からサンプルテーブルを作り直したりそこからdameo様のおっしゃってくださった方法を咀嚼して、ようやく道が見えてきました。 自分の中で整理することが大事だと気付かされました。 dameo様のアドバイスを頂いた方法を自己解決の形で載せますが、この方法が実際に正しいのか、もっと良い方法があるのか、そういったことも本当はさらにご指導いただけたらありがたいのですが、掲示板の仕組みでは自己解決を記載すると終了してしまうようですね。 甘えず、自分でもっと精進します。 ありがとうございました。
guest

回答2

0

原則SQL文は値をみてつなぐテーブルを変えることはできません
SELECT句にサブクエリを仕込むなど工夫が必要になりそうですが
サンプルが無いとホントは何をやりたいか伝わってきません

投稿2022/12/01 10:44

yambejp

総合スコア114784

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

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

0

ベストアンサー

dameo様のアドバイスを受け、テーブルもちゃんと自分にわかりやすくサンプルを作り直して考えてみたところ、このような形で解決できることに気づきました。
テーブルをCASE文するのかと一は思っておりましたが、yambejp様のご回答でそれはできないと知り、新しい知識になりました。ありがとうございました。

SELECT 元テーブル.`連番id`, 元テーブル.`顧客ID`,元テーブル.`データID`, 接続1テーブル.MEMO ,接続2テーブル.MEMO , CASE WHEN 接続1テーブル.MEMO IS NOT NULL THEN 接続1テーブル.MEMO ELSE 接続2テーブル.MEMO END FROM `元テーブル` LEFT JOIN 接続1テーブル ON 接続1テーブル.データID = 元テーブル.データID LEFT JOIN 接続2テーブル ON 接続2テーブル.データID = 元テーブル.データID;

投稿2022/12/04 13:23

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問