• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:mysql where句複数テーブル複数条件摘出)

MySQLで複数テーブルの複数条件を結合する方法

このQ&Aのポイント
  • MySQLを初めて勉強する初心者の方が、複数のテーブルを結合して条件に合うデータを取得する方法を質問されています。
  • 具体的には、t_seito、m_kyouka、t_scoreという3つのテーブルを結合し、社会科目の点数が50以上かつ英語科目の点数が50以下のデータを取得したいとのことです。
  • しかし、該当する条件に合うデータが取得できず、エラーメッセージが表示されてしまっています。質問者はネットや参考書で調べたが解決策が見つからなかったため、質問をすることになりました。

質問者が選んだベストアンサー

  • ベストアンサー
  • yossy_kt
  • ベストアンサー率50% (103/203)
回答No.3

実現したいことは以下のどちらでしょうか? 1.社会が50以上または英語が50以下の生徒を抽出する。 2.社会が50以上かつ英語が50以下の生徒を抽出する。 1.の場合は、社会と英語で別々に抽出してもよいのではないでしょうか? -- 社会 SELECT t_seito.id, t_seito.name, t_score.score FROM t_seito INNER JOIN t_score ON (t_seito.id = t_score.seito_id) WHERE t_score.kyouka_id = 4 AND t_score.score >= 50; -- 英語 SELECT t_seito.id, t_seito.name, t_score.score FROM t_seito INNER JOIN t_score ON (t_seito.id = t_score.seito_id) WHERE t_score.kyouka_id = 5 AND t_score.score <= 50; どうしても1SQLでやりたいなら次のようにもできますが、社会と英語の結果が入り混じります。 SELECT t_seito.id, t_seito.name, t_score.kyouka_id, t_score.score FROM t_seito INNER JOIN t_score ON (t_seito.id = t_score.seito_id) WHERE (t_score.kyouka_id = 4 AND t_score.score >= 50) OR (t_score.kyouka_id = 5 AND t_score.score <= 50); 2.の場合はちょっと複雑ですが、次のような感じでしょうか。 SELECT t_seito.id, t_seito.name, shakai.score, eigo.score FROM t_seito INNER JOIN t_score AS shakai ON (t_seito.id = shakai.seito_id AND shakai.kyouka_id = 4) INNER JOIN t_score AS eigo ON (t_seito.id = eigo.seito_id AND eigo.kyouka_id = 5) WHERE shakai.score >= 50 AND eigo.score <= 50; ちなみに、1.の場合で見やすく抽出する場合は、上記2.のSQLのWHERE部分をANDからORに変更すればOKです。 SELECT t_seito.id, t_seito.name, shakai.score, eigo.score FROM t_seito INNER JOIN t_score AS shakai ON (t_seito.id = shakai.seito_id AND shakai.kyouka_id = 4) INNER JOIN t_score AS eigo ON (t_seito.id = eigo.seito_id AND eigo.kyouka_id = 5) WHERE shakai.score >= 50 OR eigo.score <= 50; 試してないので動作保証できませんが、大体上記のような感じになると思います。

その他の回答 (2)

回答No.2

テーブルの結合は一つテーブルで複数行が一行に結合される事は無いので、結合されたテーブルにはkyouka_idも当然1個しかありません。条件で`kyouka_id`=4とkyouka_id`=5が同時に成り立つ事は有りえないので結果は0行と成ります。望みの行を表示させるには and (`kyouka_id`=4 and `score` >=50 or `kyouka_id`=5 and `score` <=50)とする必要が有ります。

回答No.1

1レコードに5教科横並びにとらないと、とんでもなく面倒ですよ。 また記述されてるコードはとてもヘンテコなコードですよ。

関連するQ&A