MySQL: как выбрать все результаты, которые не соответствуют LEFT JOIN - PullRequest
1 голос
/ 21 сентября 2011

Мой оператор SELECT по существу:

SELECT *, user.user, response.survey FROM survey, user, response ORDER BY survey.added

Однако я пытаюсь выбрать только те опросы, на которые не были получены ответы. Таблица «Ответ» содержит 4 релевантных столбца (идентификатор пользователя [пользователя, отвечающего на опрос], ответ, вопрос [такой же, как идентификатор опроса, если отдельный вопрос, если несколько, соответствует идентификатору вопроса], и идентификатор опроса)

Я пытаюсь написать оператор SQL, который выбирает все опросы, которые не имеют ответа от произвольного идентификатора пользователя ($ _SESSION ['userId'])) ... Попытался обойти это, используя также различные LEFT JOIN как вложенные команды SELECT, но не смогли понять это.

Может кто-нибудь пролить свет на то, как это сделать?

Ответы [ 2 ]

1 голос
/ 21 сентября 2011

Или просто присоединитесь влево и проверьте столбец справа на null:

SELECT *, user.user, response.survey FROM user 
LEFT JOIN response ON response.user=user.user 
LEFT JOIN survey ON survey.surveyID=response.surveyID 
WHERE user.user=[userID from session] AND response.user IS NULL ORDER BY survey.added

Поскольку, если соответствующий столбец в таблице ответов отсутствует, response.user будет иметь значение NULL.

0 голосов
/ 21 сентября 2011

Это утверждение Select вы написали:

SELECT *, user.user, response.survey FROM survey, user, response ORDER BY survey.added

выполняет перекрестное объединение (получает все возможные комбинации пользователя, ответа и опроса), и это явно не тот способ, которым данные приводятся между таблицами; поэтому неправильно. Вам необходимо объединить 3 таблицы общим ключом.

Но чтобы ответить на ваш вопрос ...

Если есть таблица с ответами конкретного пользователя; затем сделайте что-то вроде этого:

select * from survey s where s.survey_id not in (
select survey_id from response where userId=<particular_user_id>)
and s.user_id=<particular_user_id>

И это вернет все опросы, на которые пользователь не ответил.

Надеюсь, идея ясна.

...