2013-11-02 31 views
0

之間,我有以下問題,我有3代表的第一個被稱爲課程在那裏我有MySQL的左連接表中沒有日期

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

現在的作品,但不排除其與同一日期等課程分配如何查看我試圖以獲取可用的學生課程3,啓動學生02-03和02-08結束,學生2在課程3中沒有顯示,學生1在課程2中開始01-03並結束03-01所以不應該可用。

任何幫助將不勝感激。對不起,如果我的英語不太好。先謝謝了。

回答

1

我用你的SQL小提琴(倒是另一名學生記錄)http://sqlfiddle.com/#!2/246645/1

試試這個發現可能參加課程3所有的學生,因爲他們在這段時間不是一類:

SELECT student.* 
FROM student 
JOIN course 
    ON course.id = 3 
    AND student.available_start <= course.`start` 
    AND student.available_end >= course.`end` 
WHERE NOT EXISTS 
    (SELECT * 
    FROM student_to_course 
    JOIN course AS c 
    ON student_to_course.course_id = c.id 
    WHERE student.id = student_to_course.student_id 
     AND (course.`start` BETWEEN c.`start` AND c.`end` 
      OR 
      course.`end` BETWEEN c.`start` AND c.`end` 
      OR 
      c.`start` BETWEEN course.`start` AND course.`end`)); 
+0

真棒,我一整天都在想如何去做。我就知道。應該在某個地方使用子查詢,但我無法理解它們。現在我研究你的查詢,所以我希望它能更好。再次感謝。 – Alex