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

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

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

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

Q&A

解決済

3回答

1801閲覧

テーブル設計と要件を満たすカラム指定の問題

Kei227

総合スコア44

MySQL

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

0グッド

0クリップ

投稿2015/11/06 07:39

編集2015/11/06 09:56

・火曜日2限に開講されている授業一覧
を表示させるために下記のテーブルを設定し、

lang

1create table classes ( 2 id int primary key auto_increment, 3 name text 4); 5 6insert into classes (id,name) values (1,'IT'); 7insert into classes (id,name) values (2,'Math'); 8 9create table weekdays ( 10 weekday_id int primary key auto_increment, 11 weekday_name text, 12 id int, 13 foreign key (id) references classes (id) 14); 15 16insert into weekdays (weekday_id,weekday_name) values (1,'Sunday'); 17insert into weekdays (weekday_id,weekday_name) values (2,'Monday'); 18insert into weekdays (weekday_id,weekday_name) values (3,'Tuesday'); 19 20create table classtimes ( 21 classtime_id int, 22 id int, 23 foreign key (id) references classes (id), 24 weekday_id int, 25 foreign key (weekday_id) references weekdays (weekday_id) 26); 27 28insert into classtimes (id,classtime_id,weekday_id) values (1,1,1); 29insert into classtimes (id,classtime_id,weekday_id) values (1,2,1); 30insert into classtimes (id,classtime_id,weekday_id) values (1,3,1); 31insert into classtimes (id,classtime_id,weekday_id) values (2,1,2); 32insert into classtimes (id,classtime_id,weekday_id) values (2,2,2); 33insert into classtimes (id,classtime_id,weekday_id) values (2,3,2); 34insert into classtimes (id,classtime_id,weekday_id) values (2,1,3); 35insert into classtimes (id,classtime_id,weekday_id) values (2,2,3); 36insert into classtimes (id,classtime_id,weekday_id) values (2,3,3);

下記のsql文を書きましたが、

lang

1select classes.name from classtimes 2inner join classes on classtimes.classtime_id = classes.id 3inner join weekdays on classtimes.classtime_id = weekdays.weekday_id 4where weekdays.weekday_id = 3;

下記のようにエラーが発生してしまいます。

lang

1+------+ 2| name | 3+------+ 4| Math | 5| Math | 6| Math | 7+------+

うまく出力されない理由として、

・classtimeテーブルのinsert文がおかしい

ということは考えついたのですが、具体的にどう直せばいいのか分かりません。訂正していただけないでしょうか?

よろしくお願いお願いいたします。

=======
修正:
weekdaysテーブルとclasstimesテーブルの順番がおかしかったので訂正しました。
エラー内容はEmpty setです。

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

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

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

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

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

KiyoshiMotoki

2015/11/06 07:44

本当にこの順番でSQLを実行しましたか? classtimesテーブルはweekdaysテーブルを参照しているので、 weekdaysテーブルより先にclasstimesテーブルを作成することはできないはずです。 また、単に 「うまく出力されません」 ではなく、どのような現象が起きる(または、起きない)のかを詳しく記載して下さい。 エラーメッセージが表示されるのであれば、それも添付して下さい。
Kei227

2015/11/06 08:58

編集し直しました。
guest

回答3

0

ベストアンサー

ご質問の内容からは2限を表現するデータがどれなのかが読み取れませんでしたが、
とりあえずclasstimesテーブルのclasstime_idカラムだと仮定して回答させていただきます。

正しいSQL文は

sql

1SELECT classes.name 2FROM classes 3INNER JOIN classtimes 4 ON classes.id = classtimes.id 5WHERE classtimes.weekday_id = 3 6 AND classtimes.classtime_id = 2;

または

sql

1SELECT classes.name 2FROM classes 3INNER JOIN classtimes 4 ON classes.id = classtimes.id 5INNER JOIN weekdays 6 ON classtimes.weekday_id = weekdays.weekday_id 7WHERE weekdays.weekday_name = 'Tuesday' 8 AND classtimes.classtime_id = 2;

です。

Kei227様のSQL文が意図通りの結果を返さない原因は、テーブル結合(INNER JOINの部分のことです)の条件付けを間違えているからです。
1つ目の結合条件ですが、classesテーブルで"授業"を一意に識別するカラムはidで、classtimesテーブルでclasses.idを参照しているカラムもidなので、

sql

1on classtimes.id = classes.id

とすべきでした。

2つ目の結合条件については、そもそもweekdaysテーブルの結合条件に同テーブルを使用していないですね。
weekdaysテーブルで"曜日"を一意に識別するカラムはweekday_idなので、1つ目の結合条件と同様に

sql

1on classtimes.weekday_id = weekdays.weekday_id

とすべきでした。

結果的に意図するデータを取得できているとしても、これではデータの内容や条件が変更されると、再び意図通りに動かなくなりますよ。

あと、weekdaysテーブルにidカラムは不要です。
"曜日"と"授業"を紐づける役割はclasstimesテーブルが担っているので、
weekdaysテーブルが直接、classesテーブルを参照する必要はないためです。

投稿2015/11/06 13:23

編集2015/11/06 13:31
KiyoshiMotoki

総合スコア4791

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

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

Kei227

2015/11/06 13:36

詳しい解説のほど、ありがとうございます!!
guest

0

最後に【limit1】をつけることで解決できました。

sql

1select classes.name from classtimes 2inner join classes on classtimes.classtime_id = classes.id 3inner join weekdays on classtimes.classtime_id = classes.id 4where weekdays.weekday_id = 3 and classtime_id = 2 limit 1;

投稿2015/11/06 10:32

Kei227

総合スコア44

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

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

KiyoshiMotoki

2015/11/06 13:25 編集

このSQL文は誤っています。 回答に詳しい説明をさせていただきますので、ご確認ください。
guest

0

classtimesのテーブルで、classtime_id int primary key auto_incrementとプライマリーキーとして使ってしまっているので、これをclasses.idと結びつけようとしてもまったく無関係なものとなってしまい、うまくいきません。

classtimes.idclasses.idと外部キーで結ばれているので、INSERT時にclasstimes.idに適切な値を入れて、こちらでJOINしましょう。

投稿2015/11/06 08:06

maisumakun

総合スコア145183

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

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

Kei227

2015/11/06 08:18

classtime_idのprimary keyを外し、insert文を下記のように編集したのですがEmpty setと出てしまいます。 ========== insert into classtimes (classtime_id,weekday_id) values (1,1); insert into classtimes (classtime_id,weekday_id) values (2,1); insert into classtimes (classtime_id,weekday_id) values (3,1); insert into classtimes (classtime_id,weekday_id) values (4,1); insert into classtimes (classtime_id,weekday_id) values (5,1); insert into classtimes (classtime_id,weekday_id) values (1,2); insert into classtimes (classtime_id,weekday_id) values (2,2); insert into classtimes (classtime_id,weekday_id) values (3,2); insert into classtimes (classtime_id,weekday_id) values (4,2); insert into classtimes (classtime_id,weekday_id) values (5,2); insert into classtimes (classtime_id,weekday_id) values (1,3); insert into classtimes (classtime_id,weekday_id) values (2,3); insert into classtimes (classtime_id,weekday_id) values (3,3); insert into classtimes (classtime_id,weekday_id) values (4,3); insert into classtimes (classtime_id,weekday_id) values (5,3); ========== *月曜日の1~5限、火曜日の1~5限のようなことを意図して書いています。
maisumakun

2015/11/06 09:11

1コマの授業を定義する上で、曜日・時間・科目の3つ組が必要だと思うのですが…上のINSERTで「科目」は指定もしていないですよね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問