特に「条件はWHERE句ではなくON句に入らなければならない」に関する多くの質問と回答を読んだ後は、これをどうにかして知っておくべきだと思います。しかし、私はまだ迷っています。
私は3つのテーブルを持っており、通常は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_idsも含まれる可能性があります。クエリが正確にそれらの2(または他のセット)を持つものだけを返す必要がある場合、クエリがどのように見えるかを確認するのは興味深いことですが。WHERE question.id = 2の場合、1つの質問を持つすべてのタスクを取得するのは簡単ですが、WHERE句のANDは空の結果になります。