mysql - 选择由给定的先决条件列表完全满足的类(class)

标签 mysql sql prerequisites relational-division

我正在尝试编写一个 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)
  • 执行不同的集合操作:选择第一个集合中所有存在的和第二个集合中不存在的所有集合 看起来很简单,但我现在对联结表以及如何在许多先决条件下处理它感到困惑。

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

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

谢谢

最佳答案

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/

相关文章:

mysql - 无法解决这个sql语句来存档我的真正目标

sql - 在 postgresql 中翻转 bool 值

Makefile:如果不存在则忽略先决条件

visual-studio - Visual Studio 安装和部署 : Adding Pre Requisits

javascript - 我需要了解良好的 javascript 才能使用 jquery 吗?

mysql - 导入从 MySQL Workbench 正向工程生成的 SQL 时出现错误 1064

MySQL JOIN 两张表

MySQL - 根据表中的名称出现对用户进行排名;从名称中查找排名

mysql - SQL 连接具有一对多关系 - 将多个关系合并为一行?

sql - LINQ to Entities 实体化错误