2014-09-04 54 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