数据库查询,给出意外结果

时间:2009-10-15 21:42:08

标签: sql mysql

我正在努力跟踪我的学生,以及那些还没有预订过课程的学生(我是一名音乐老师以及一名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 个答案:

答案 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())

答案 1 :(得分:0)

罗伯特,

对您如何存储信息做出合理的假设,您的查询会选择您的数据库未列出 future 预定课程的学生。学生是否有过去的课程并不重要。我不确定你的意思是“尚未预订课程”,因为英语短语有点尴尬。它与“不是/从未预订过课程”不同吗?单词“not yet ”表示不是在当前时间之前,建议您跟踪已经预订的已预订课程以及预订“尚未预订”的课程(无论这意味着什么) 。没有水晶球,我不知道你如何跟踪学生预订的课程,但还没有。

在任何情况下,如果对于特定学生,您的数据库不会列出该学生将来开始的课程,您将在结果中看到该学生(无论您为该学生列出的任何课程现在开始或在过去)。

您的查询也有一个奇怪的事情,那就是您在根据计数限制结果之前,在lesson.student = student.person_id上加入表“lesson”和“student”。在我看来,如果你想要一个满足某些条件的学生列表,你只需要在外部查询的FROM子句中使用“student”,就像在rexem的查询中一样。

如果您想查看那些没有任何课程记录的学生(无论课程的开始时间如何),rexem的查询都应该有效。如果表“学生”仅列出每个学生一次,则不需要DISTINCT。使用EXISTS的优势在于,使用EXISTS而不是COUNT,您不建议在将计数与零进行比较之前,需要计算每个学生的未来课程总数。有了EXISTS,您建议在找到任何此类课程后,无需继续寻找学生的未来课程。