PHP PDO оставил таблицы соединений, в которых поля не совпадают

Я создаю викторину для клиента, который хочет, чтобы результаты их викторины автоматически сохранялись, и я столкнулся с проблемой, я пытаюсь выбрать все вопросы, на которые пользователь не ответил в определенной викторине, я сохраняя результат каждого вопроса, на который был дан ответ, в таблицу RESULTS, но мое утверждение путается, когда более одного пользователя имеют результаты в таблице RESULTS, если бы кто-нибудь мог взглянуть на мой код и дать мне какой-либо совет, это было бы очень много оценил. Заранее спасибо!

Основываясь на этих таблицах и заявлении, следующий вопрос, который мне нужно загрузить, это que_id = 3 для use_id = 1, но проблема, с которой я столкнулся, заключается в том, что он возвращает que_id = 1 и que_id = 3, потому что на них ответили пользователи use_id = 2 и use_id 3, еще раз спасибо!

ТАБЛИЦА ВОПРОСОВ

que_id qui_id que_question que_ans_id
1      1      lorem 1?     1
2      1      lorem 2?     6
3      1      lorem 3?     12

ТАБЛИЦА РЕЗУЛЬТАТОВ

res_id res_use_id res_qui_id res_que_id res_ans_id
1      1          1          1          2
2      1          1          2          6
3      2          1          3          10
4      3          1          1          1

PHP

$statement_question = $db->prepare("SELECT * FROM roa_quiz
                                    LEFT JOIN roa_questions ON qui_id = que_qui_id
                                    LEFT JOIN roa_results ON que_id = res_que_id
                                    WHERE qui_id = :qui_id AND res_use_id != :use_id");

$statement_question->setFetchMode(PDO::FETCH_ASSOC); 

$statement_question->execute(array(':qui_id' => 1, ':use_id' => 1));

$question = $statement_question->fetch();

person Mitchell Layzell    schedule 29.06.2013    source источник


Ответы (2)


Вы пытаетесь получить строки, которые не совпадают. Идея состоит в том, чтобы использовать left outer join для получения совпадающих строк. . . а затем проверьте, где нет совпадений. Для этого требуется две вещи: (1) перемещение условий в предложение on и (2) проверка на отсутствие совпадений в предложении where:

SELECT *
FROM roa_quiz LEFT JOIN
     roa_questions
     ON qui_id = que_qui_id LEFT JOIN
     roa_results
     ON que_id = res_que_id and res_use_id = :use_id
where qui_id = :qui_id AND results.res_que_id is null
person Gordon Linoff    schedule 29.06.2013
comment
Спасибо большое имеет смысл! - person Mitchell Layzell; 30.06.2013

Я бы пошел с sql:

SELECT * FROM roa_quiz
JOIN roa_questions ON qui_id = que_qui_id
LEFT JOIN roa_results ON que_id = res_que_id AND res_use_id = :use_id
WHERE qui_id = :qui_id
AND res_id IS NULL

Это должно дать вам список оставшихся без ответа вопросов пользователя для викторины. Посмотрите здесь несколько полезных диаграмм по sql присоединяется. В этом случае нам нужно левое внешнее соединение с исключением.

person WayneC    schedule 29.06.2013