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

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

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

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

mysqli

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

phpMyAdmin

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

Q&A

解決済

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

cpg.rde9456qsl
cpg.rde9456qsl

総合スコア2

MySQL

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

mysqli

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

phpMyAdmin

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

2回答

0グッド

0クリップ

234閲覧

投稿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を使ってメモを優先順位どおりに出せばいいのかなと思います。」というのが解なのかな?といま検討中ですが、能力不足でまだそのヒントを生かせておりません。
もうしばらく考えるお時間を頂きたいと思います。

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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2022/12/01 21:54依頼された後にこの質問は修正されています

こちらの質問が他のユーザーから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました。

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 編集

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

2022/12/04 13:20

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

回答2

1

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

投稿2022/12/01 10:44

yambejp

総合スコア109126

spoofy_dragon😄を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

cpg.rde9456qsl

総合スコア2

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

MySQL

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

mysqli

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

phpMyAdmin

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