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

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

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

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

Q&A

解決済

3回答

2364閲覧

MySQLにてSelectの結合を用いてのカラム指定

Kei227

総合スコア44

MySQL

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

0グッド

0クリップ

投稿2015/11/05 11:51

(1)ある顧客(name='1')の1回の購入時の商品一覧を表示。
(2)2015-6-1に売り上げられた商品一覧を表示。
(3)商品('product_id=1')を仕入れいている業者一覧を表示。
(4)業者('company_id=1')の売上商品一覧を表示。

の上記の問題を解決するために、

================
(1)select product_name from products, details, orders, members where name = '1';
(2)select product_name from products, order_details, order where time = 2015-6-1;
(3)select company_name from companys, purchases, products where product_id = 1;
(4)select product_name from products, purchases, companys where company_id = 1;

というコードを書いたのですが、Empty setと表示されてしまいます。INNER JOINを用いる方法も探してみたのですが、理解できませんでした。解決方法を教えていただけないでしょうか?

テーブルの指定は以下の通りです。

================
create table members (
id int primary key auto_increment,
name varchar(50),
email varchar(50) unique
);

insert into members (name) values('1');

create table orders (
order_id int primary key auto_increment,
time date,
total int
);

insert into orders (time) values ('2015-6-1');

create table details (
detail_id int primary key auto_increment,
foreign key (detail_id) references orders (order_id),
foreign key (detail_id) references products (product_id)
);

create table products (
product_id int primary key auto_increment,
product_name varchar(100),
cost int
);

insert into products (product_id,product_name) values (1,'aaa');

create table purchases (
purchase_id int primary key auto_increment,
foreign key (purchase_id) references products (product_id)
);

create table companys (
company_id int primary key auto_increment,
company_name varchar(100)
);

insert into companys (company_id,company_name) values (3,'zazz');

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

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

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

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

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

guest

回答3

0

ベストアンサー

解決済みになってますが、あえて回答します。

テーブル設計がいろいろおかしいですね。
外部キー設定のSQLも間違っているようです。

とりあえず、下記のようなテーブル設計になるようにしましょう。

マスターテーブル

members member_id 主キー name email
products product_id 主キー product_name cost
companys company_id 主キー company_name

中間テーブル(一つの商品に複数の仕入先がある場合に必用)

purchases product_id 外部キー(products) company_id 外部キー(companys) product_id と company_id で複数カラム主キー

トランザクションテーブル

orders order_id 主キー member_id 外部キー(members) order_time total
details detail_id 主キー order_id 外部キー(orders) product_id 外部キー(products)

というような感じになります。これは一例です。運用実態によって変わる場合もあります。

投稿2015/11/05 14:47

編集2015/11/05 15:33
hatena19

総合スコア33605

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

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

Kei227

2015/11/06 03:16

ご回答ありがとうございます! purchases テーブルでproduct_id 外部キー(products)を設定する場合、purchase_idを作成して 【foreign key (purchase_id) references products (product_id)】 と書いていました。外部キーを設定するときは ============== 親テーブル: CREATE TABLE 親テーブル名(親カラム名 データ型) ; 子テーブル: CREATE TABLE 子テーブル名(子カラム名 データ型, FOREIGN KEY (子カラム名) REFERENCES 親テーブル名(親カラム名) ) ; =========== と認識していたのですが間違っていたでしょうか? また、 (1)ある顧客(name='1')の1回の購入時の商品一覧を表示。 (2)2015-6-1に売り上げられた商品一覧を表示。 (3)商品('product_id=1')を仕入れいている業者一覧を表示。 (4)業者('company_id=1')の売上商品一覧を表示。 の上記の問題を解決するために、 ======== select product_name from products, details, orders, members where name = '1'; select product_name from products, details, orders where time = '2015-06-01'; select company_name from companys, purchases, products where product_id = 1; select product_name from products, purchases, companys where company_id = 1; ======== というselect文を書いたのですが、これで当たっていますでしょうか?
hatena19

2015/11/06 05:57

上の回答のテーブルの設計例を見て、ピンとこないなら、データペースの設計の基本が理解できていないと思われます。まずは、WEBで「正規化」をキーワードに検索して、入門者向け解説ページで学習してください。 また、主キー、外部キー、結合の意味、役割も理解するようにしてください。 > というselect文を書いたのですが、これで当たっていますでしょうか? 間違っています。from句でテーブルを羅列するだけでは、意味のある結果にはなりません。 正しいテーブル設計、主キー、外部キーの正しい設定ができて、各テーブルを inner join 等で正しく結合する必要があります。 > 親テーブル: > CREATE TABLE 親テーブル名(親カラム名 データ型) ; > > 子テーブル: > CREATE TABLE 子テーブル名(子カラム名 データ型, > FOREIGN KEY (子カラム名) > REFERENCES 親テーブル名(親カラム名) > ) ; > =========== > と認識していたのですが間違っていたでしょうか? これはあってますが、提示されたSQLはそうなってませんね。 下記のコードの意味が、完全ではなくてもいいので、ある程度は理解できるように入門サイトや入門書で学習しましょう。このスペースだけではとても解説しきれませんので。 http://sqlfiddle.com/#!9/88178/1
Kei227

2015/11/06 06:11

詳しくご教授ありがとうございます。 まずは基本から復習したいと思います。
guest

0

トランザクションテーブルには、メインテーブルの主キーを外部キーとして持たせて、各テーブルを結合できるようにする。SQLでは、各テーブルを結合しないと希望の出力にはなりません。

上記の設計なら、(1)は下記のSQL。

SQL

1select orders.*, details.product_id 2from 3orders inner join details on orders.order_id = details.order_id 4inner join products on details.product_id = products.product_id 5inner join members on orders.member_id = members.member_id 6where members.name = '1';

実行結果
http://sqlfiddle.com/#!9/88178/1

投稿2015/11/06 00:53

編集2015/11/06 00:54
hatena19

総合スコア33605

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

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

Kei227

2015/11/06 04:29

ありがとうございます。 insert into details (order_id, product_id) values (1,1); insert into details (order_id, product_id) values (1,2); insert into details (order_id, product_id) values (1,3); insert into details (order_id, product_id) values (2,1); insert into details (order_id, product_id) values (2,2); は、どういうことを意味しているのでしょうか? また、全てのテーブルのカラムを一気に表示させる方法があれば教えていただきたいです。(select * from テーブル名で、個別のテーブルの中身を見ることはできるのはわかるのですが、一文でデータベース内の全てのテーブルの中身を見ることができるのか知りたいです。)
hatena19

2015/11/06 05:41

この上の私のコメントは、付ける場所を間違えてました。私の回答にコメントしたものです。すみません。 ややこしいので、私のコメントで回答します。
guest

0

実行してみてないので、違うかも知れませんが、「details」テーブルにinsert文が無いので、空ではないでしょうか?
また、「details」「purchases」の3つは、外部キー参照してる要素を「auto_increment」にすると色々問題があると思います。

投稿2015/11/05 11:59

編集2015/11/05 12:00
hirohiro

総合スコア2068

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

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

hirohiro

2015/11/05 12:17

(2)は「order_details」「order」ってテーブルが無いのでエラーになるでしょうし (3)は「purchases」テーブルが空のため出力も空白 (4)も(3)と同じだと思います。
hirohiro

2015/11/05 12:27 編集

「details」に値を入れて(1)を動かしてみました。 http://sqlfiddle.com/#!9/284db5/1 ただこのSQLは、「1回の購入時の商品一覧」という条件を満たさないかも知れないですね。そのユーザの購入履歴全てを表示しているように思います。 どういう条件の時1回とするのか分からないので、修正方法もわからないですけども…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問