我正在尝试编写一个 SQL 查询,该查询将返回一个人有资格参加的类(class)列表,给定他们已完成的科目列表(用作先决条件)。

我的数据库是这样布置的。

   Prerequisite:
   +---------------+---------------+
   |      Id       |     Name      |         (Junction table)
   |---------------|---------------|         CoursePrerequisites:
   |      1        |   Maths       |         +---------------+---------------+
   |      2        |   English     |         |  Course_FK    | Prerequisite_FK
   |      3        |   Art         |         |---------------|---------------|
   |      4        |   Physics     |         |      1        |      1        |
   |      5        |   Psychology  |         |      1        |      2        |
   +-------------------------------+         |      2        |      3        |
                                             |      2        |      5        |
   Course:                                   |      5        |      4        |
   +---------------+---------------+         +---------------v---------------+
   |      Id       |     Name      |
   |---------------|---------------|
   |      1        |   Course1     |
   |      2        |   Course2     |
   |      3        |   Course3     |
   |      4        |   Course4     |
   |      5        |   Course5     |
   +---------------v---------------+

我一直在试验一个看起来像这样的查询:
    SELECT  DISTINCT C.*
        FROM    Course C
    INNER JOIN JNCT_Course_Prerequisites cp
        ON C.Id = cp.Course_FK
    WHERE   cp.Prerequisite_FK IN (SELECT Prerequisites.Id FROM Prerequisites Where Name = 'Art' AND Name = etc etc)

然而,这将返回任何以艺术为先决条件的类(class),而不仅仅是给定的先决条件列表完全满足的类(class)。例如。它将返回仅将艺术作为学生先决条件的类(class) 2,即使该类(class)还需要心理学。

我对 SQL 很陌生,所以如果我的表布局等有问题,或者这是一个看似简单的问题,请原谅。我一直在尽我所能四处寻找,但只能找到似乎是这个问题相反的解决方案。

看来我需要做一组差异:
  • 构建一组具有先决条件的类(class)(针对每个先决条件?)
  • 构建一套没有先决条件的类(class)
  • 执行差集操作:选择所有出现在第一组,不出现在第二组
    看起来很简单,但我现在对连接表以及如何在许多先决条件下处理这个问题感到困惑。

  • 我希望返回至少完全满足给定先决条件列表的行,而不是包含至少一个先决条件的行。

    例如,如果给出先决条件“艺术”、“英语”、“心理学”,那么应该返回的唯一行是 Course2 的行(满足先决条件)。

    谢谢

    最佳答案

    SELECT  * FROM Course C LEFT JOIN Course_Prerequisites cp ON C.Id = cp.Course_FK
             WHERE Prerequisite_FK IN (SELECT Prerequisites.Id FROM Prerequisites Where Name = 'Art' OR Name = etc etc)
     NOT EXISTS
       (SELECT  * FROM Course C LEFT JOIN Course_Prerequisites cp ON C.Id = cp.Course_FK
             WHERE Prerequisite_FK NOT IN (SELECT Prerequisites.Id FROM Prerequisites Where Name = 'Art' OR Name = etc etc))
    

    关于mysql - 选择完全满足给定先决条件列表的类(class),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20671624/

    10-11 20:55