2

私は2つのテーブルを持っています:

question
question_id | question

question_answer
answer_id | question_id | choice_id | user_id | explain

特定のユーザーがまだ回答していないすべての質問を取得したいと思います。

SELECT question, question_id as questionId 
FROM question q 
LEFT JOIN question_answer qa USING(question_id)
WHERE qa.user_id!=$userId

この場合、行はゼロになります。私もやってみました

SELECT question, q.question_id as questionId 
FROM question q 
LEFT JOIN question_answer qa ON q.question_id=qa.question_id AND qa.user_id!=$userId

明らかに、これはすべてのレコードを返します。このクエリの作成方法をここで説明しました。

4

4 に答える 4

2

特定のユーザーをチェックする部分は、LEFT JOIN逆にする必要があります。つまり、ではありませuser_id = $userIduser_id <> $userId

結果の行から、 (まだ)回答されていないuser_id IS NULL質問を見つける場所を選択します。$userId

SELECT question, q.question_id as questionId 
FROM question q 
LEFT JOIN question_answer qa ON q.question_id=qa.question_id AND qa.user_id=$userId
WHERE qa.user_id IS NULL
于 2012-11-15T14:05:39.393 に答える
2

JOIN操作を使用する必要がない場合は、これを試してみることができます

特定のユーザーがまだ回答していないすべての質問を取得したい:

select * from question
where
    question_id not in (select distinct question_id from question_answer where user_id=$userId);

Sqlfiddleのデモを見る

not in動作より遅いのか速いのかわからないJOIN

于 2012-11-15T14:36:57.370 に答える
1

代わりにこれを試してください:

SELECT question, q.question_id as questionId 
FROM question q 
LEFT JOIN question_answer qa ON q.question_id = qa.question_id 
WHERE qa.user_id IS NULL;

SQLフィドルデモ

これにより、まだ回答のない質問が表示されます。

ただし、まだ質問に回答していないユーザーを取得する場合はJOIN、usersテーブルに追加する必要があります。何かのようなもの:

SELECT u.id, u.name
FROM  users u 
LEFT JOIN question_answer qa ON qa.user_id = u.id
WHERE qa.question_id IS NULL;

更新されたSQLフィドルデモ

于 2012-11-15T14:03:54.730 に答える
1

上記のMGからの回答を単純に変更します

SELECT question, q.question_id as questionId 
FROM question q 
LEFT JOIN question_answer qa ON q.question_id = qa.question_id 
and qa.user_id=2
WHERE qa.user_id IS NULL;
于 2012-11-15T14:26:03.150 に答える