Я думаю, что должен как-то это знать, особенно после прочтения множества вопросов и ответов о том, что «условие должно быть в предложении ON, а не в предложении WHERE». Тем не менее, я все еще потерян.
У меня есть три таблицы, и я обычно присоединяюсь к ним с помощью LEFT (OUTER) соединений. Соединяемые таблицы выглядят так (стандартно):
task_id task_questions_taskId taskQuestions_questionId question_id 1 1 5 5 1 1 8 8 2 2 8 8
SELECT `t`.`id` AS `task_id` ,
`task_questions`.`taskId` AS `task_questions_taskId` ,
`task_questions`.`questionId` AS `task_questions_questionId` ,
questions.id AS question_id
FROM `task` `t`
LEFT OUTER JOIN `task_questions` `task_questions`
ON ( `task_questions`.`taskId` = `t`.`id` )
LEFT OUTER JOIN `question` `questions`
ON ( `task_questions`.`questionId` = `questions`.`id` )
Это стандартный запрос для получения всех записей. (Это взято из Yii; я действительно хочу сделать это с помощью Active Record, но не могу даже правильно понять простой SQL).
И теперь я хочу получить ТОЛЬКО те задачи, которые имеют question_id 2 И 8 (например), поэтому, если у задачи нет обоих этих question.id, я не хочу, чтобы она была в наборе результатов. В этом случае у задачи могут быть и другие question_id. Хотя было бы интересно посмотреть, как будет выглядеть запрос, если он должен возвращать только те, у которых есть именно эти 2 (или любой другой набор). Легко получить все задачи, содержащие один вопрос, с WHERE question.id = 2, но AND в предложении WHERE приводит к пустому результату.