【问题标题】:database query, giving unexpected result数据库查询,给出意想不到的结果
【发布时间】:2009-10-15 21:42:07
【问题描述】:

我正在尝试跟踪我的学生,以及那些尚未与我预订课程的学生(我是一名音乐老师和一名 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

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    试试:

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

    【讨论】:

      【解决方案2】:

      罗伯特,

      对您可能如何存储信息做出合理假设,您的查询会选择那些您的数据库没有列出未来预定课程的学生。学生是否有过去的课程并不重要。我不确定您所说的“尚未预订课程”是什么意思,因为那个英语短语有些尴尬。它与“未/从未预订过课程”有什么不同? “not yet”字样表示不在当前时间之前,表示您跟踪已预订的已预订课程和“尚未预订”的预订课程(无论是什么意思) .如果没有水晶球,我不知道您如何跟踪学生预订的课程,但目前还没有。

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

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

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

      【讨论】:

        猜你喜欢
        • 2020-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-19
        相关资源
        最近更新 更多