3

結合に関する小さなロジックの問題があります。答えを出すためのデータベースがあります。スキーマは次のとおりです。

Question
question_id
question_text

Answers
answer_id
question_id
answer_text

User Responses
user_id
answer_id
question_id

ユーザーがまだ回答していない質問を見つけようとしていますが、nullの応答が返され続けます。クエリは次のとおりです。

SELECT * FROM questions 
    LEFT JOIN responses ON questions.question_id = responses.question_id 
WHERE user_id != '1'

私の論理はどこでうまくいかなかったのですか?

4

6 に答える 6

2

ISNULLでLEFTJOINを試してください

SELECT q.question_id FROM questions q
    LEFT JOIN responses r ON q.question_id = r.question_id AND r.user_id = 1
WHERE r.question_id IS NULL
于 2012-04-13T11:52:27.847 に答える
2

ユーザーID1のユーザーが回答していない質問を取得します

SELECT * FROM questions 
    LEFT JOIN responses ON questions.question_id = responses.question_id 
WHERE responses.question_id IS NULL AND user_id = 1
于 2012-04-13T11:53:10.063 に答える
1

左結合を使用する代わりに、サブクエリを使用します。これは、MSSQLで行う方法です。MySQLを微調整する必要がある場合があります。

SELECT * FROM questions WHERE question_id NOT IN (
    SELECT question_id FROM responses WHERE user_id = 1
)

右のテーブルにある値をチェックする必要がある左結合は、頭痛の種になる可能性があります。この特定のタイプのクエリについて、この方法でクエリを実行する方が簡単で信頼性が高いと思います。

于 2012-04-13T11:53:24.667 に答える
1

別の可能性はEXISTS準結合です。

SELECT *
FROM   questions q
WHERE  NOT EXISTS (
   SELECT * 
   FROM   responses r
   WHERE  r.question_id = q.question_id
   AND    r.user_id = 1
   );
于 2012-04-13T12:12:22.257 に答える
0

これを試して:

Select * 
from Question
where question_id not in (select question_id from Responses where user_id=1)
于 2012-04-13T12:05:32.490 に答える