次の問題があります。3 つのテーブルがあります。最初のテーブルはコースと呼ばれ、
courses| id | start | end |
--------------------------------------
1 2012-10-12 | 2012-11-12 |
students| id | available_start | available_end |
-------------------------------------------------
1 2012-10-13 2012-11-11
2 2012-11-06 2012-11-08
students_to_courses | student_id | course_id |
-------------------------------------------------
1 1
そのため、コース期間に利用できる学生を見つけようとしています。したがって、学生が Student_to_courses に追加され、日付がコースの日付の間にある場合、私はそれを必要としません。クエリにはサブクエリを使用する必要があると感じていますが、本当に理解できません。私のクエリは現在このようになっていますが、正しく機能しません。
SELECT s.id
FROM (`students` s)
LEFT JOIN `student_to_course` s2c ON `s2c`.`student_id` = `s`.`id`
LEFT JOIN `courses` assigned_2_course ON `s2c`.`course_id` = `assigned_2_course`.`id`
LEFT JOIN `courses` c ON `c`.`id` = 1
WHERE
(
(s.available_start NOT BETWEEN assigned_2_course.start AND assigned_2_course.end
AND
s.aviailable_end NOT BETWEEN assigned_2_course.start AND assigned_2_course.end
) OR assigned_2_course.end IS NULL)
AND
`s`.`available_start` BETWEEN c.start AND c.end
AND `s`.`available_end` <= c.end
GROUP BY `s`.`id`
ORDER BY `s`.`id` desc
ここはhttp://sqlfiddle.com/#!2/49c11/1です
現在は機能していますが、同じ日付の他のコースに割り当てられている学生は削除されません。02-03 から 02-08 までのコース 3 で利用可能な学生を取得しようとしています。学生 2 はコースに参加しています。 3 は表示されていません。学生 1 は、01-03 に始まり 03-01 に終わるコース 2 にいるため、利用できないはずです。
どんな助けでも大歓迎です。