2016-06-20 11 views
2

SQL Fiddle選択MariaDBにおける未解決の複数の選択肢の質問のいずれかの/ MySQLの

は、私は、複数の選択肢の質問のいずれかを取得したい(バイオリンは本当に私に動作していない)が避難所」 IDが99のユーザーが回答しました。彼は質問0121の代わりにchoice idを格納するuser_answerのテーブルに見られるように、ただ1つの質問、つまりA questionに答えました。

私の予想結果はこのようにする必要があり、次のSQLで

Question Question_id Choice_id Choice 
B question  2  3  B choice 1 
B question  2  4  B choice 2 

それとも

C question  3  5  C choice 1 
C question  3  6  C choice 2 
C question  3  7  C choice 3 

、私はその選択肢

とちょうどどちらかBかCの質問をフェッチトラブルを抱えています
SELECT q.question_id,q.question,qc.choice,qc.choice_id   
FROM question_choice qc 
INNER JOIN question q ON q.question_id = qc.question_id 
WHERE qc.question_id NOT IN 
(SELECT question_id 
    FROM user_answer ua 
    INNER JOIN question_choice qc ON qc.choice_id = ua.choice_id 
    WHERE ua.user_id = 99) 
GROUP BY qc.choice_id 
ORDER BY q.question_id; 

私はlimit clauseに何を入れて、ただ1つのunaさまざまな選択肢のある質問とnswered質問。

表:

CREATE TABLE question 
(question_id INT, question VARCHAR(100)); 

CREATE TABLE question_choice 
(question_id INT, choice_id INT,choice VARCHAR(100)); 

CREATE TABLE user_answer 
(user_id INT,choice_id INT); 

INSERT INTO question (question_id,question) 
VALUES 
(1,"A question"), 
(2,"B question"), 
(3,"C question"); 

INSERT INTO question_choice (choice_id,choice,question_id) 
VALUES 
(1,"A choice 1",1), 
(2,"A choice 2",1), 
(3,"B choice 1",2), 
(4,"B choice 2",2), 
(5,"C choice 1",3), 
(6,"C choice 2",3), 
(7,"C choice 3",3); 

INSERT INTO user_answer(user_id,choice_id) 
VALUES 
(99,2); 

答えて

2

あなたは正しい軌道に乗っています。しかし、これはあなたが解決策に到達することを考えるのに役立ちます。私はNOT EXISTSNOT INを置き換え

SELECT q.* 
FROM question q 
WHERE NOT EXISTS (SELECT question_id 
        FROM user_answer ua INNER JOIN 
         question_choice qc 
         ON qc.choice_id = ua.choice_id 
        WHERE ua.user_id = 99 AND qc.question_id = q.question_id 
       ); 

注:

まず、あなたはこのようなクエリを使用して回答されていない質問のリストを取得することができます。彼らはNULLの値を別々に扱うので、NOT EXISTSを使用することを強く推奨します - NULLの値の扱いはより直感的です。

あなたはその後、未回答の質問についての情報の残りの部分を取得するクエリでこれを使用することができ

SELECT q.question_id, q.question, qc.choice, qc.choice_id 
FROM (SELECT q.* 
     FROM question q 
     WHERE NOT EXISTS (SELECT question_id 
         FROM user_answer ua INNER JOIN 
          question_choice qc 
          ON qc.choice_id = ua.choice_id 
         WHERE ua.user_id = 99 AND qc.question_id = q.question_id 
         ) 
    ) q JOIN 
    question_choice qc 
    ON qc.question_id = q.question_id; 

あなたが好きなら、あなたはサブクエリを削除することによって、このクエリを「簡素化」する方法で作業することができます。

1
SELECT 
    * 
FROM 
    (
    SELECT DISTINCT 
     q.question_id 
     ,q.question 
    FROM 
     question_choice qc 
     INNER JOIN question q 
     ON q.question_id = qc.question_id 
     LEFT JOIN user_answer ua 
     ON qc.choice_id = ua.choice_id 
     AND ua.user_id = 99 
    WHERE 
     ua.user_id IS NULL 
    LIMIT 1 
    ) nq 
    INNER JOIN question_choice nqc 
    ON nq.question_id = nqc.question_id 

私はLEFT JOINモデルが好きですが、NOT EXISTS()構造があまりにも動作します。

+0

Matt、ありがとう。私は答えられていない質問だけのいずれかが必要ですが、あなたのSQLは答えられていない質問のすべてを取得しています。 – RedGiant

+1

いいえ問題LIMIT 1を追加し、質問をどのように選択するかによって注文します。あなたはいつも、それが無回答の無作為の最初の一意のidであることを望んでいますか?質問のみ、または選択肢もありますか? – Matt

+0

申し訳ありません私自身の質問に答えてLIMIT1を行い、それをquestion_choiceテーブルに戻して選択肢を取得してください。回答が更新されます。 – Matt

関連する問題