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

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

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

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

Q&A

解決済

3回答

30609閲覧

mysql where句 複数テーブルで複数条件の摘出

kuroniyusha

総合スコア8

MySQL

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

0グッド

0クリップ

投稿2015/05/14 04:43

編集2015/05/14 05:11

※t_scoreテーブルの表示がうまくいかないので質問を削除しようと思ったのですが、
調べたところ現状は削除することはできないようですので、大変読み辛いと思いますが、
もし以下の質問に対してご助言くれる方いらっしゃいましたらよろしくお願い致します。

こんにちわ。
mysqlを二日前から勉強し始めた超初心者です。
まったくの初心者なので質問が的外れかもしれませんがよろしくお願い致します。

以下の三つのテーブルがあります。

t_seito

id name comment created_at
11 赤井 あかい 0000-00-00 00:00:00
22 青葉 あおば 0000-00-00 00:00:00
33 白木 しらき 0000-00-00 00:00:00

m_kyouka

kyouka_id ky_name
1 国語
2 数学
3 理科
4 社会
5 英語

t_score

sc_id seito_id sckyouka_id score
1 11 1 50
2 22 1 80
3 33 1 23
4 11 2 94
5 22 2 43
6 33 2 67
7 11 3 13
8 22 3 76
9 33 3 59
10 11 4 78
11 22 4 40
12 33 4 35
13 11 5 64
14 22 5 87
15 33 5 30

この三つのテーブルをwhere句で結合させて
社会が50以上で英語が50点以下のデータを全て表示する。
という条件で摘出したいのですが・・・

select * from m_kyouka,t_seito,t_score
where kyouka_id=sckyouka_id
and id=seito_id
and kyouka_id=4
and score >=50
and kyouka_id=5
and score <=50

と入力したところ
”返り値が空でした (行数 0)。 (Query took 0.0000 seconds.)”
と表示されました。

いろいろとネットや参考書などで調べてはいたのですが、
該当する条件がなかなか見つからず今回はじめて質問をさせていただきました。
何卒ご教授のほどよろしくお願い致します。

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

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

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

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

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

guest

回答3

0

and kyouka_id=4
and score >=50
and kyouka_id=5
and score <=50

この条件をはずすと下みたいにただデータが横に並んだデータが出てくるはずです

id name comment created_at kyouka_id ky_names c_id seito_id sckyouka_id score
11 赤井 あかい 0000-00-00 00:00:00 1 国語 1 11 1 50
22 青葉 あおば 0000-00-00 00:00:00 1 国語 2 22 1 80
33 白木 しらき 0000-00-00 00:00:00 1 国語 3 33 1 23
11 赤井 あかい 0000-00-00 00:00:00 2 数学 4 11 2 94


提示されたSQLですとこのデータの中から
教科は社会かつ英語で点数が50点以下かつ50点以上の条件を横1列のデータですべて満たすデータを探します
なので見つかるはずはありません

かくならこんな感じで社会用と英語用でt_scoreを2回結合する必要があります

lang

1SELECT 2 sei.name 3 , so_nam.ky_names 4 , so.score 5 , en_nam.ky_names 6 , en.score 7FROM t_seito sei, t_score so, t_score en, m_kyouka so_nam, m_kyouka en_name 8WHERE sei.id = so.seito_id 9AND sei.id = en.seito_id 10AND so.sckyouka_id = so_nam.kyouka_id 11AND en.sckyouka_id = en_nam.kyouka_id 12-- 社会で絞り込み 13AND so.kyouka_id = 4 14AND so.score >= 50 15-- 英語で絞り込み 16AND en.kyouka_id = 5 17AND en.score <= 50 18

ついでですがFROM句でテーブルに別名を書いて
WHERE句やSELECT句では、どのテーブルのカラムかを意識して書くようにしましょう
でないと今回のようにSQLを書くときかぶらないように
カラム名を何テーブルのidとかにしなければならなくなります

投稿2015/05/14 05:38

編集2015/05/14 07:39
kutsulog

総合スコア985

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

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

kutsulog

2015/05/14 05:46

JOINを使うならこんな感じで SELECT * FROM t_seito sei -- 社会科の絞り込み JOIN t_score so ON sei.id = so.seito_id AND so.sckyouka_id = 4 AND so.score >= 50 -- 英語で絞り込み JOIN t_score en ON sei.id = en.seito_id AND en.sckyouka_id = 5 AND en.score <= 50 -- 教科の名前を結合 JOIN m_kyouka kyo ON kyo.kyouka_id = so.sckyouka_id OR kyo.kyouka_id = en.sckyouka_id
kuroniyusha

2015/05/14 08:40

コメント&ご指摘いただきありがとうございます! 別名に設定などもできるんですね、知りませんでした! まだまだ勉強不足なので勉強になります。これからもがんばって生きたいと思います。
guest

0

すみません。
未テストです。

社会が50以上で英語が50点以下のデータを全て表示する。

社会が50以上かつ、英語が50点以下だった生徒の全データ(社会・英語以外も含め)を表示する。

と読み替えました。
正確に書いた方が良いと思います。

lang

1SELECT * 2FROM 3 t_score sc 4 INNER JOIN t_seito s 5 ON sc.seito_id = s.id 6 INNER JOIN m_kyouka k 7 ON sc.sckyouka_id = k.kyouka_id 8WHERE 9 sc.seito_id IN ( 10 SELECT seito_id 11 FROM t_score 12 WHERE sckyouka_id = 4 13 AND score >=50) 14 AND 15 sc.seito_id IN ( 16 SELECT seito_id 17 FROM t_score 18 WHERE sckyouka_id = 5 19 AND score <=50) 20

投稿2015/05/14 05:10

編集2015/05/14 05:14
kantomi

総合スコア295

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

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

kantomi

2015/05/14 05:16

ちなみに、結合はFROM句、抽出はWHERE句と分けておかないと、将来、苦労することになります。
kuroniyusha

2015/05/14 08:32

ご指摘とコメントありがとうございます! 次回から気をつけます! いまいちまだ構文の構成や読み書きが理解ができてないのでこれからも勉強を続けて行きたいと思います。
guest

0

ベストアンサー

こんにちは。

そもそも、両方の条件に合致するデータが存在していないのでは??

「社会が50以上」で「英語が50点以下」のデータを全て表示となると、両方の条件を満たす必要があるように思えます。

「社会が50以上のデータ」と「英語が50点以下のデータ」をそれぞれ表示させたい場合は、
select * from m_kyouka,t_seito,t_score
where kyouka_id=sckyouka_id
and id=seito_id
and ((kyouka_id=4 and score >=50 ) OR (kyouka_id=5 and score <=50 ))

になると思います。
ORの部分で条件が切れてしまうので、最後の行の条件をひとまとめに()でくくっています。

投稿2015/05/14 05:06

編集2015/05/14 05:13
kaputaros

総合スコア1844

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

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

kuroniyusha

2015/05/14 05:13

さっそくのコメントありがとうございます! そしてすいません。t_scoreテーブルの一部記入漏れがありました;
kaputaros

2015/05/14 05:34

それでも、やっぱり条件を満たすレコードがないようです。 t_score テーブルだけで見るとそれぞれ 「社会が50点以上」を満たすレコード sc_id seito_id sckyouka_id score --------------------------------------- 10 11 4 78 「英語が50点以下」を満たすレコード sc_id seito_id sckyouka_id score --------------------------------------- 15 33 5 30 となりますが、 > and id=seito_id で t_seitoテーブルともつないで「idが同じ人」という条件が加わっているのですが、 上のレコードでは seito_id が一致しませんよね? なので、hitしないんだと思います。
kuroniyusha

2015/05/14 08:34

コメントありがとうございます。 無事に表記させたいデータを抽出できましたのでベストアンサーとさせていただきます。 まだまだ勉強不足なので今後ともこのサイトも含めいろいろ活用して自分で勉強をがんばりたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問