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

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

解決済

4回答

105閲覧

SQLを教えてください

Qoo

総合スコア1249

MySQL

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

SQL

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

0グッド

0クリップ

投稿2018/11/26 18:00

下記のような3つのテーブルから商品テーブルに登録されているすべての商品に対する価格設定、受注を表示したいのですが、
どのように考えればよいのかわかりません。

商品テーブル
item lot
大根 L
大根 M
大根 S

価格設定テーブル
item lot price
大根 L 200
大根 M 100

受注テーブル
item lot order
大根 L 5
大根 M 10

表示したい内容
商品テーブルに登録されているすべての商品に対する価格設定、受注

item lot price order
大根 L 200 5
大根 M 100 10
大根 S 0 0

どのようにすればよいでしょうか

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

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

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

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

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

Orlofsky

2018/11/26 23:54

priceを直接 商品テーブル に持てば 価格設定テーブル は不要では?
guest

回答4

0

受注テーブルは商品につき1件ということはないでしょうから、集計しています。

SQL

1select itm.item, itm.lot, prc.price, coalesce(odr.order_sum, 0) 2from 商品テーブル itm 3 left join 価格設定テーブル prc 4 on itm.item=prc.item 5 and itm.lot=prc.lot 6 left join ( 7 select item, lot, sum(`order`) as order_sum 8 from 受注テーブル 9 group by item, lot 10 ) odr 11 on itm.item=odr.item 12 and itm.lot=odr.lot 13order by itm.item, itm.lot

または

SQL

1select itm.item, itm.lot, prc.price 2 , coalesce((select sum(`order`) from 受注テーブル where item=itm.item and lot=itm.lot), 0) 3from 商品テーブル itm 4 left join 価格設定テーブル prc 5 on itm.item=prc.item 6 and itm.lot=prc.lot 7order by itm.item, itm.lot

投稿2018/11/27 01:10

sazi

総合スコア25173

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

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

0

select item, lot, price, order from (商品テーブル left join 価格設定テーブル on 商品テーブル.item=価格設定テーブル.item and 商品テーブル.lot=価格設定テーブル.lot) left join 受注テーブル on 商品テーブル.item=受注テーブル.item and 商品テーブル.lot=受注テーブル.lot

で、どうでしょうか?

投稿2018/11/26 22:58

seesaajira-

総合スコア107

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

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

0

つLEFT OUTER JOIN

投稿2018/11/26 20:14

hichon

総合スコア5737

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

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

0

ベストアンサー

SQLの例はもう出ているので、考え方を説明します。

他のテーブルに値がなくても表示したい、というときには、LEFT (OUTER) JOINを使うのが一般的です。

参考:これでわかった!? LEFT / RIGHT JOIN.

結果のテーブルのイメージができているのであれば、あとは商品テーブルをメインにして
各テーブルと項目を=でつなぐだけ。
注意したいのは、値がない場合、nullと表示されてしまうこと。
ただ、LEFT JOINしただけだと、大根 Sの行はnullと表示されます。
これを関数を使ってnull -> 0に補完してあげます。

関数を使うときはDBの種類によって変わってくるので、ライブラリを調べるといいと思います。
参考:SQL文でNullの置換

投稿2018/11/27 02:06

kaputaros

総合スコア1844

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

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

sazi

2018/11/27 02:22

Nullの置換については、COALESCEがSQL標準で、現状では、主だったDBMSは対応しています。(リンク先は古いですね)
kaputaros

2018/11/27 02:51 編集

あぁ、タグを見落としてました。MySQLなんですね。 そして、他のDBでもCOALESCE使えるんですね。 ご指摘ありがとうございます。 でも、DBのバージョンによっては使えない可能性がある、ということですね。 勉強になりました。
Qoo

2018/11/27 04:10

回答ありがとうございます。 リンク先とても参考になりました。 2つのテーブルまではわかりやすかったのですが、3つ以上のテーブルで混乱していました。。 商品テーブルをメインにしてくっつけていけば良いのですね! COALESCEについても参考になりました!ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問