2013-11-02 23 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