2017-02-23 82 views
-1

你好我試圖運行一個特定的查詢爲我的最後一年的項目,我想找出在2014年本科生學習計算機科學的數量& 2016.我的表使用課程註冊&課程來記錄註冊在計算機科學課程的學生人數。使用自我加入和計數的SQL查詢問題

我的幫助我的上司,他建議我使用上courseEnrollments自聯接只是使其更容易找到入選2014年& 2016年學生相同的CS招生下面的查詢顯示了你我是怎麼寫的:

SELECT COUNT(*) 
FROM courseEnrollment 
WHERE StudentID IN 
    (SELECT X.StudentID 
    FROM courseEnrollment Y 
    JOIN courseEnrollment X 
    ON Y.courseID = X.courseID 
    JOIN courses C 
    ON Y.courseID = C.courseID 
    WHERE C.courseName = 'Computer Science' 
    AND X.StartAcademicYear = 2014 
    AND Y.StartAcademicYear = 2016); 

當我跑了它在MySQL上,我得到錯誤的結果(這是4不是6),因爲它只能算作學生在2014年&不是2016年的計算機科學招收請告訴我,我怎麼能解決這個問題。謝謝!

P.S.我只在內部查詢中添加了「X.StudentID」,以防止MySQL與StudentID屬性混淆。將其更改爲「Y.StudentID」給了我2.同樣,我想知道爲什麼它不計算所有這6名學生( 2註冊於2016年& 4註冊於2014年)註冊在計算機科學。

+0

也許你應該確保,從X和學生是學生從Y是同一個人。 – michaJlS

+0

怎麼樣?內部聯接不是爲我做的嗎? – Magan

+0

你有2014年**和** 2016入學的學生嗎? –

回答

1

如果學生可以採取這種行動只是一次

SELECT COUNT(*) 
FROM courseEnrollment ce 
JOIN courses c ON ce.courseid=c.courseid 
WHERE c.courseName = 'Computer Science' AND 
     ce.startAcademicYear IN (2014, 2016) 
+0

您認爲使用自我連接適合課程註冊嗎? – Magan

+0

我不明白你爲什麼需要它。可能我仍然誤解你的問題。我的查詢是否返回您正在查找的結果? –

+0

它的確如此,因爲在我的數據庫中有6名學生註冊了計算機科學,例如因爲他們在第一年是2016年的2人,而2014年的4人目前是他們的最後一年。我的最後一年項目是爲了成爲一個數據倉庫,其中這些表將加入事實表,但現在它是無用的大聲笑。我會和我的主管談談這件事。 – Magan