2009-10-15 63 views
0

我試圖跟蹤我的學生,還有那些還沒有和我一起預定的課程(我是音樂老師和CS學生),但我的嘗試實際上是給我所有那些已經預訂了課程的人,我的錯誤是什麼?數據庫查詢,給出意想不到的結果

SELECT DISTINCT student.person_id FROM student, lesson 
WHERE lesson.student = student.person_id 
AND (select count(*) 
    FROM lesson 
    WHERE student = student.person_id 
    AND start_time > NOW()) = 0 

回答

2

嘗試:

SELECT DISTINCT s.person_id 
    FROM STUDENT s 
WHERE NOT EXISTS(SELECT NULL 
        FROM LESSONS l 
        WHERE l.student = s.person_id 
        AND l.start_time > NOW()) 
0

羅伯特,

使你可以如何存儲信息的合理假設,你的查詢選擇那些學生對他們來說,你的數據庫沒有列出任何未來計劃的教訓。無論學生是否有過去的課程都沒關係。我不確定你的「尚未預定課程」是什麼意思,因爲這個英語短語有些尷尬。與「沒有/沒有預定過課程」有什麼不同嗎? 「not yet」表示目前不在,建議您跟蹤已預訂的預訂課程,並且還預訂了「尚未預訂」的課程(無論這意味着什麼)。沒有一個水晶球,我不知道你如何跟蹤學生已經預定的課程,但還沒有。

無論如何,如果某個學生的數據庫沒有列出將來爲該學生開始的課程,則會在結果中看到該學生(無論您爲該學生列出的任何課程是從現在開始還是在過去)。

你的查詢還有一個奇怪的事情,那就是你在加入lesson.student = student.person_id中的表格「lesson」和「student」之前,根據計數限制結果。在我看來,如果你想要一個滿足某些條件的學生列表,你只需要在外部查詢的FROM子句中使用「student」,就像在rexem的查詢中一樣。

如果你想看看那些你沒有任何課程記錄的學生(不管課程的開始時間如何),rexem的查詢應該可以工作。如果表「學生」僅列出每個學生一次,則不需要DISTINCT。使用EXISTS的優勢在於,使用EXISTS而不是COUNT,在將計數與零進行比較之前,您不建議需要爲每位學生計算未來課程的總數。有了EXISTS,你建議一旦找到這樣的課程,就不需要繼續尋找學生未來的課程。

相關問題