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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

2284閲覧

SQL テーブルの結合について

harukitchen

総合スコア34

MySQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2016/02/23 07:04

クイズシステムを作りたいと思っています。
テーブルは以下のように2つ用意しています。

[quiz_t (問題マスターテーブル)]
question_id (問題ID)
question (問題)

[user_t ユーザー回答テーブル]
user_id (ユーザーID)
question_id (答えた問題ID)

問題マスターに格納されている問題を一覧に出して、ユーザーがその問題に答えたか答えてないかを一緒に表示したいと思っています。

結果の例:
[ユーザー(user01)の回答状況]
問題1 回答済み
問題2 未回答
問題3 未回答
問題4 回答済み

これを再現するにはどういうSQL文を書けばよろしいでしょうか?
答えた問題だけを表示するなら以下のSQL文で出来たのですが、答えてない問題も合わせて一緒に取得したいと思っています。

select question_id from quiz_t inner join user_t using(question_id) where user_id='user01';

答えた問題のみユーザー回答テーブルに格納されているものとします。
内部結合か外部結合で出来るものなのでしょうか?
よろしくお願いします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

LEFT JOINで回答済みの問題を結合して
結合できれば回答済み、結合できなければ未回答でいいと思います。

SQL

1SELECT 2 quiz_t.question_id 3 , CASE 4 WHEN user_t.user_id IS NULL THEN '未回答' 5 ELSE '回答済み' 6 END status 7FROM quiz_t 8LEFT JOIN user_t 9ON user_t.question_id = quiz_t.question_id 10AND user_t.user_id = 'user01'

投稿2016/02/23 07:44

kutsulog

総合スコア985

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

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

harukitchen

2016/02/23 07:51

ご回答いただきありがとうございます! 上記のSQL文で目的のものが得られました。 ONの後にANDで繋げる事によって出来るのですね。where句に書いてしまってはまっていました。ありがとうございました。
guest

0

NULLをアプリケーションで扱いたくなければSQLで変換しておくことも可能です。

SQL

1select 2 Q.question_id, 3 CASE WHEN U.user_id IS NULL THEN '未回答' ELSE '回答済み' END AS `status` 4from quiz_t Q 5left join user_t U using(question_id) 6where user_id='user01';

投稿2016/02/23 07:35

dupont_kedama

総合スコア925

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

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

harukitchen

2016/02/23 07:45 編集

ご回答ありがとうございます。 上記のSQL文を実行してみましたが、回答済みの結果しか得られませんでした。 テーブルの設計が良くないのでしょうか。 ユーザー回答テーブルには user01 1 user01 4 user02 2 user02 4 というようなデータを格納しています。
kutsulog

2016/02/23 07:52 編集

結合した後にユーザーで絞ってしまうと 未回答の問題はuser_idがNULLになっているため取得できず 結局INNER JOINをしているのと変わらなくなってしまいます 未回答も取得したかったら結合条件でuser_idを指定する必要があります
harukitchen

2016/02/23 07:53

ありがとうございます。 where句ではなく結合条件でuser_idを指定するのですね。 試したところそれでうまくいきました。 3番目の回答の方を先に見てそれでうまくいったのでベストアンサーにできず申し訳ありません。 ありがとうございました!
dupont_kedama

2016/02/23 07:55

そうでしたね。お恥ずかしい。
guest

0

left joinを利用すれば良いと思います。
以下を参照
http://www.pursue.ne.jp/jouhousyo/SQLDoc/select22.html

また、回答なしという表示をする場合は、selectの項目でnullだった場合という条件を記載します。
これは利用しているDBMSにより変わります。

投稿2016/02/23 07:23

t_obara

総合スコア5488

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

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

harukitchen

2016/02/23 07:37

ご回答ありがとうございます。 left joinを用いたSQL文は以下となるのでしょうか? select question_id from quiz_t left join user_t using(question_id) where user_id='user01'; この場合も内部結合と同じ結果しか得られませんでした。 where句でuser01というIDを指定しなかったら全ての問題が取得できるのですが、今回はユーザーIDを指定しています。 DBMSはMySQLを使用しております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問