【问题标题】:Help with SQL join combined with lots of subqueries帮助结合大量子查询的 SQL 连接
【发布时间】:2011-07-22 12:44:20
【问题描述】:

我在连接方面的经验有限,这个谜题让我很困惑。

以下是我的 mysql 数据库中的相关表:

  • 学生桌
  • 描述给定课程部分的部分表
  • 在部门和学生之间创建多对多关系的映射表
  • 描述考试的考试表
  • 考试和部分之间的多对多映射表
  • exam_schedules 表,描述了可以参加考试的日期。 Exams 和exam_schedules 之间存在一对多的关系。

我的目标:检索在给定日期安排考试的部分中注册的所有学生。还可以获取学生在给定日期必须参加的每项考试的考试安排信息。最好在每个学生exam_schedule 对的结果集中都有一行。

我有一个查询完成了我目标的前半部分(它有很多子查询):

SELECT * FROM `students` WHERE `id` IN
    (SELECT `student_id` FROM `sections_students` WHERE `section_id` IN
        (SELECT `section_id` FROM `sections_exams` WHERE `exam_id` IN
            (SELECT `exam_id` FROM `exam_schedules` WHERE `date` = DATE('$date') AND `exam_id` IN
                (SELECT `id` FROM `exams` WHERE `isAutoSignup` = 1))))

我想不通的是如何将连接合并到其中以实现我的目标的后半部分。我的每一次尝试都产生了语法错误。拜托,谁能指出我正确的方向?提前致谢!

【问题讨论】:

    标签: mysql sql join subquery


    【解决方案1】:

    您可以通过连接完成所有这些操作,从而获得exam_schedules

    SELECT s.*, es.*
      FROM students s
    JOIN sections_students ss on s.id          = ss.student_id
    JOIN sections_exams    se on se.section_id = ss.section_id
    JOIN exam_schedules    es on es.exam_id    = se.exam_id and date = DATE('$date')
    JOIN exams             e  on e.id          = es.exam_id and isAutoSignup = 1
    

    【讨论】:

      【解决方案2】:

      这是一个镜头:

      SELECT S.Student_name, E.Exam_name, ES.date
      FROM students S
      LEFT OUTER JOIN SECTIONS_STUDENTS SS
        ON SS.student_id = S.stuent_id
      LEFT OUTER JOIN SECTIONS_EXAMS SE
        ON SE.section_id = SS.section_id
      LEFT OUTER JOIN  EXAMS E
        ON E.exam_id = SE.exam_id
      LEFT OUTER JOIN EXAM_SCHEDULES ES
        ON ES.exam_id =E.exam_id
      WHERE 1=1
        AND E.isAutoSignup = 1
        AND ES.Date = DATE('$date')
      

      加入就像写出你的想法。

      我想要学生 我希望学生分部 我想要这些部分的考试 我想要考试时间表 以这种方式过滤考试时间表和考试...

      【讨论】:

      • 这就是我一直以来的加入方式。如果你写:SELECT * FROM a,b,c,d,e WHERE ,你很可能会不小心做出错误的交叉连接。但为什么是外部与内部?它可以去任何一种方式。不过我希望看到没有考试的学生。
      • 是的,但是 OP 想要考试的学生。您的查询实际上等同于使用内部联接,因为 E.isAutoSignup 和 ES.Date 上的谓词位置错误(对于没有考试的学生,它们将为 NULL)。
      猜你喜欢
      • 2011-09-06
      • 1970-01-01
      • 2012-07-14
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-23
      相关资源
      最近更新 更多