我想我应该以某种方式知道这一点,尤其是在阅读了很多关于“条件必须进入 ON 子句,而不是 WHERE 子句”的问题和答案之后。然而,我还是迷路了。
我有三个表,我通常使用 LEFT (OUTER) 连接加入它们。连接的表看起来像这样(retty 标准):
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.ids,我不希望它出现在结果集中。在这种情况下,任务也可能有其他 question_id。尽管如果查询应该只返回那些恰好具有那些 2(或任何其他集合)的查询,那么看看查询的外观会很有趣。WHERE question.id = 2 很容易得到所有只有一个问题的任务,但是 WHERE 子句中的 AND 会导致结果为空。