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

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

ただいまの
回答率

90.48%

  • MySQL

    6038questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 12K+

kuroniyusha

score 6

※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.)”
と表示されました。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

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 14:13

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

    キャンセル

  • 2015/05/14 14: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しないんだと思います。

    キャンセル

  • 2015/05/14 17:34

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

    キャンセル

0

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

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

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

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


SELECT * 
FROM 
    t_score sc
    INNER JOIN t_seito s
        ON sc.seito_id = s.id
    INNER JOIN  m_kyouka k
        ON sc.sckyouka_id = k.kyouka_id
WHERE  
    sc.seito_id IN (
        SELECT seito_id 
        FROM t_score 
        WHERE sckyouka_id = 4 
            AND score >=50)
    AND
    sc.seito_id IN (
        SELECT seito_id 
        FROM t_score 
        WHERE sckyouka_id = 5
            AND score <=50)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/14 14:16

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

    キャンセル

  • 2015/05/14 17:32

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

    キャンセル

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回結合する必要があります
SELECT
    sei.name
  , so_nam.ky_names
  , so.score
  , en_nam.ky_names
  , en.score
FROM t_seito sei, t_score so, t_score en, m_kyouka so_nam, m_kyouka en_name
WHERE sei.id = so.seito_id
AND sei.id = en.seito_id
AND so.sckyouka_id = so_nam.kyouka_id
AND en.sckyouka_id = en_nam.kyouka_id
-- 社会で絞り込み
AND so.kyouka_id = 4
AND so.score >= 50
-- 英語で絞り込み
AND en.kyouka_id = 5
AND en.score <= 50

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/14 14: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

    キャンセル

  • 2015/05/14 17:40

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

    キャンセル

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

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • MySQL

    6038questions

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