我有这些表格。
课程
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( ) )
谢谢
答案 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)