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

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に必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

1356閲覧

【mysql】条件のあるデータ取得の方法を教えてほしい

k499778

総合スコア599

MySQL

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

SQL

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

0グッド

0クリップ

投稿2016/07/25 13:27

現在SQLを勉強しています。現場のデータベースがMySQLなのでMySQLを勉強中です。

現在書き方がわからないものがあるのですが教えていただくことはできますでしょうか?

少し変な例えになるかもしれませんが、以下の様なテーブルがあり、

イメージ説明

売上表.売上Noがあれば、売上表から顧客CDを取得し、
なければ顧客表から顧客CDを取得する。

このようなSQLを書きたいのです。

CASE式が使えるのかと考えたのですが、うまくSQLに表現できず、わからずにいます。

もしアドバイスいただける方がいればよろしくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

コメントを踏まえて行いたいことをSQLに起こすと以下のような感じですかね。

SQL

1SELECT 2 MAIN.* 3FROM 4 ( 5 SELECT 6 CASE 7 WHEN T2.ID IS NOT NULL THEN '1' -- 果物 8 WHEN T3.ID IS NOT NULL THEN '2' -- 野菜 9 ELSE NULL 10 END AS 食べ物区分 11 , COALESCE(T2.ID, T3.ID) AS ID 12 , COALESCE(T2.名前, T3.名前) AS 名前 13 , COALESCE(T2.値段, T3.値段) AS 値段 14 FROM 15 食べ物テーブル T1 16 LEFT JOIN 果物テーブル T2 17 ON T1.果物ID = T2.ID 18 LEFT JOIN 野菜テーブル T3 19 ON T1.野菜ID = T3.ID 20 ) MAIN

一応上記のクエリで、
0. 食べ物テーブルにあって果物テーブルにもあるなら果物からデータ表示
0. 食べ物テーブルにあって果物テーブルにないなら野菜からデータ表示

という要件は満たせるかと思います。

ただし、食べ物テーブルの1レコードで果物ID、野菜IDどちらもデータが存在するパターンの場合、
果物テーブルの値が優先出力されます。

この辺はもう少し要件を詰める必要があるかもですね。
ちなみに上記SQLでは擬似的に食べ物区分というカラムをサブクエリで作ってますが、
不要でしたらカットして下さい^^

###追記
もしかしたらこちらも要件捉え間違えてるかもしれません。
上記クエリは以下の前提条件を満たす必要があるので、確認お願い致します。

  1. 食べ物テーブルは「果物ID」、「野菜ID」のカラムを持つこと
  2. 上記2カラムから果物テーブル、野菜テーブルそれぞれIDでリンクされていること

特に2番目は重要で、果物が存在しない場合に野菜からデータ取得したいとした時、
IDでリンクされていない状態であるとどの野菜IDのデータを取得すべきか判断できません。
(※果物の検索に利用するIDで野菜を検索するなら話は変わりますが)

投稿2016/07/25 15:38

編集2016/07/25 16:12
Panzer_vor

総合スコア1636

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

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

k499778

2016/07/25 23:06

回答ありがとうございます。 とてもわかりやすく感謝しています。 現場のデータの持ち方をもう一度確認し、適しているか見てみます。 本当にありがとうございました。
guest

0

売上表と顧客表の、リレーションは顧客CDをキーにしているわけではない?
これは売上表と顧客表になにか隠れたIDがあるのでしょうか?

投稿2016/07/25 13:34

編集2016/07/25 13:36
yambejp

総合スコア114839

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

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

k499778

2016/07/25 13:47

回答ありがとうございます。 そうですね。 これは例えなので多少強引な材料だったかもしれません。 実際はここでいう売上表と顧客表はリレーションするような関係ではないんです。 Aテーブルのaカラムにデータがあれば、Bテーブルから全件取得する。 なければCテーブルから全件取得する。 といったような内容ですね。
k499778

2016/07/25 13:52 編集

デザインが欲しかったのでネットから落としてきた画像を使い、関連性のあるテーブルという風に見えてしまったかもしれません。 文字にするとわかりづらいかもしれませんが、 -------------------------------------------------------------------------------- 「食べ物テーブル」の「果物番号」にデータがあれば、 「果物テーブル」から「id,名前,値段」を取得し、 データがなければ「野菜テーブル」から「id,名前」を所得する。 -------------------------------------------------------------------------------- といった感じのほうが実際のものに近いかもしれません。
yambejp

2016/07/25 13:57

なるほど・・・ 今回の表の比較だと、なんとなく同じデータ数があって なんとなく売上表と顧客表の同じ行がリンクしているように見えますが SQLにおいてORDER BYしない順番は無意味ですし なんらかのキーでリレーションしていなければ売上表の抜け顧客CDを 顧客表から抜き出すことは理論上不可能です。
k499778

2016/07/25 14:39

返答ありがとうございます。 >売上表の抜け顧客CDを顧客表から抜き出す これはどういうことでしょうか? とくに私はそのように言ったつもりはなかったのですが。 上の食べ物テーブルの例でもやはり理論上不可能なのでしょうか?
Panzer_vor

2016/07/25 15:13

横から失礼致します。 ちょっと要件がはっきり見えてこないのですが、 食べ物テーブルというのは「ID」を持ってて、 それには「果物ID」とか「野菜ID」が入り混じって1つのカラムに格納されてるイメージですか? それとも「果物ID」、「野菜ID」というのは別カラムに分かれて格納されてるイメージですか?
k499778

2016/07/25 15:24

ありがとうございます。 別カラムに分かれているイメージです。 そして少し修正します。「果物番号」→「果物id」 -------------------------------------------------------------------------------- 「食べ物テーブル」の「果物id」にデータがあれば、 「果物テーブル」からその「果物id」に紐づく「id,名前,値段」を取得し、 データがなければ「野菜テーブル」から「id,名前」を所得する。 -------------------------------------------------------------------------------- これでもSQLで表現することは不可能でしょうか? もし不可能であるとすれば、どうなれば可能になるでしょうか? 私が経験が浅いのと、現場のデータの持ち方を完全に再現できていない可能性が高いです。 一応このような仕様であることは確かなので、データの持ち方さえ揃えば可能になるのでは?と思っているからです。 あるいはSQLで処理する話ではないのかもしれませんが。 これをSQLで表現することは可能でしょうか?あるいは何かデータの持ち方を修正すれば可能になるでしょうか? お忙しい中恐れ入りますがお答えいただければ嬉しいです。
yambejp

2016/07/26 01:26

『データがなければ「野菜テーブル」から「id,名前」を所得する』 というのが意味不明です。 食べ物テーブルの果物idカラムにデータがない場合 かりに野菜テーブルにデータが100個あったとしてどの野菜idを取得するのでしょうか? リレーションをしないでデータを抽出すると全データが対象になりますよ
k499778

2016/07/26 12:25

そうですよね。 よく考えたらそうでした。 ご回答有り難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問