MySQL显示实际事件

时间:2014-12-11 12:45:39

标签: mysql sql date

我有这些表格。

课程

IDCourse   |   Description   |...
1          |   php           |...
2          |   MYSQL         |...

表格模块

IDModule   |  Description  | startDate  |  endDate
1          |  introduction | 2014-02-02 | 2014-02-25
2          |  oop          | 2014-02-26 | 2014-03-01
...
99         | sql suntax    | 2014-11-11 | 2014-12-12

表格CourseHasModul

IDCourse  |  IdModule
1         |  1
1         |  2
...       |  ...
2         |  99

我想让今天所有的课程都有一些活跃的模块。我正在尝试这个查询但是没有工作(我没有得到特定结果),任何想法?

SELECT * FROM course
INNER JOIN CourseHasModul ON CourseHasModul.IDCourse = course.IDCourse 
INNER JOIN modules ON modules.IDModule =CourseHasModul.IdModule
WHERE (modules.startDate  <= CURDATE( ) AND modules.endDate<= CURDATE( ) )

谢谢

3 个答案:

答案 0 :(得分:0)

如果你想要有活动模块的课程,我会选择exists

select c.*
from course c
where exists (select 1
              from CourseHasModul chm join
                   Modules m
                   on chm.IdModule = m.IdModule
              where chm.IDCourse = c.IDCourse and
                    m.datainici <= CURDATE( ) AND m.datafi >= CURDATE( )
             );

但是,此查询应返回与您的查询类似的结果(尽管对于具有多个活动模块的课程没有重复项。)

答案 1 :(得分:0)

你的查询似乎很好,我认为问题是你的条件。你必须使用“OR”代替“AND”,如果我是你,我会像下面那样编写查询,最好总是服从连接的层次结构:

select course.* from modules 
left join CourseHasModul on modules.IDModule = CourseHasModul.IdModule
left join CourseHasModul.IDCourse = IDCourse on course.IDCourse
where (modules.datainici <= CURDATE() OR modules.datafi >= CURDATE())

答案 2 :(得分:0)

我找到了解决方案:

SELECT * ,MIN(modules.startDate) AS STARTDATE,MAX(modules.endDate) AS ENDDATE
FROM course
INNER JOIN course_has_modules ON course_has_modules.IDCourse = course.IDCourse
INNER JOIN modules ON modules.IDModule = course_has_modules.IDModule

GROUP BY  course.idcourse
HAVING (CURDATE()>=STARTDATE AND CURDATE()<=ENDDATE)