2014-09-04 52 views
2

我有这4个表检索使用LEFT JOIN复杂的结果

1. course 
------------------------ 
CourseID CourseNum CourseName    

2. courseRequirements 
------------------------ 
CourseID ReqID     

3. semestercourses 
------------------------ 
CourseID     

4. studentcoursecomplete 
----------------------- 
CourseID StudentID    

的语句必须做如下因素

1显示从表过程中,课程名称,其中course.CourseID = semestercourses.CourseID
2 - 不要显示学生完成“学生课程完成”的过程
3 - 不要显示有学生要求的课程没有完成 4 - 显示有学生要求的课程

例如

这学期有3门课程(英语2,数学,体育)
约翰是一个学生
他完成的数学课程(studentcoursecomplete)
英语2有一个要求 “英语1”( courseRequirements),他没完成english1(studentcoursecomplete)如果他完成1英语,英语2将显示
所以他能看到的只是“数学”课程

我有这个说法

SELECT course.* 
FROM course 
LEFT JOIN studentcoursecomplete ON studentcoursecomplete.CourseID = course.CourseID 
LEFT JOIN courseRequirements ON courseRequirements.CourseID = course.CourseID 
WHERE courseRequirements.CourseID IS NULL 
    AND studentcoursecomplete.CourseID IS NULL 

这种说法做工精细,但如果学生完成english1,english2没有显示

回答

0

我没有看到你正在结合当前对于给定的学期公布的课程。以您的数据库结构为基础,以下查询会产生您所描述的所需效果。

SELECT c.* FROM semestercourses AS sc 
    LEFT JOIN course AS c ON sc.CourseID = c.CourseID 
    LEFT JOIN courserequirements AS cr ON cr.ReqID = c.CourseID 
    LEFT JOIN studentcoursecomplete AS scc ON scc.CourseID = c.CourseID 
WHERE 
    scc.CourseID IS NULL 

尽管先决条件未得到满足,但课程已公布,但不会显示。如果宣布并满足先决条件,并且上层课程尚未完成,则可以看到它。在本示例中,如果英语2被宣布(在semestercourses),那么在本例中完成“英语1”,那么它将对您可见。

**编辑:

SELECT c.* FROM semestercourses AS sc 
    LEFT JOIN course AS c ON c.CourseID = sc.CourseID 
    LEFT JOIN courserequirements AS cr ON cr.CourseID = sc.CourseID 
    LEFT JOIN studentcoursecomplete AS scc ON scc.CourseID = sc.CourseID 
WHERE 
    sc.CourseID NOT IN (SELECT CourseID FROM studentcoursecomplete) 
     AND 
    (cr.ReqID IS NULL OR cr.ReqID IN (SELECT CourseID FROM studentcoursecomplete)) 

好吧,运行与数据多试验几次后,做了一些改动。

+0

这不工作..我把课程放在学期课程,我试试这个,并没有正常工作 – 2014-09-04 12:34:41

+0

@GabrielBlanco,请检查更新的查询。 – Gabor 2014-09-04 13:26:34

+0

yeeeeeeeeeeeeeeeeees maaaaaaaaaaaan^_^thaaaaaaaats work fine – 2014-09-04 13:37:33