2009-10-15 74 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,你建议一旦找到这样的课程,就不需要继续寻找学生未来的课程。

相关问题