设置MySQL交叉列表查询

设置MySQL交叉列表查询,sql,mysql,database,join,Sql,Mysql,Database,Join,我有一个班级表,它存储不同大学班级的数据,一个唯一的班级ID和部门、课程等 有些类用多个名称交叉列出。例如,同一类可能被交叉列入HIST-204历史和AAST-103非洲裔美国人研究。一个类可以有两个以上的交叉列表 我想正确地存储交叉列表,这样当学生使用任何可能的交叉列表搜索class_Books表中存储的某个类的教科书时,他们就会看到所需的书籍。学生在进行搜索时是否知道其他交叉列表并不重要,重要的是他们是否获得了该课程的书籍 我想通过在类中存储一个交叉列表ID来实现这一点,这将表明给定的类只是

我有一个班级表,它存储不同大学班级的数据,一个唯一的班级ID和部门、课程等

有些类用多个名称交叉列出。例如,同一类可能被交叉列入HIST-204历史和AAST-103非洲裔美国人研究。一个类可以有两个以上的交叉列表

我想正确地存储交叉列表,这样当学生使用任何可能的交叉列表搜索class_Books表中存储的某个类的教科书时,他们就会看到所需的书籍。学生在进行搜索时是否知道其他交叉列表并不重要,重要的是他们是否获得了该课程的书籍

我想通过在类中存储一个交叉列表ID来实现这一点,这将表明给定的类只是一个现有类的交叉列表,其类ID将存储在该字段中。然后,我只需要在交叉列出的Class_ID的Class_Books中存储所需的书籍。然后,当学生在搜索中输入一个类时,我会确保包含交叉列表ID所需的所有书籍。如果您同意这是一种方法,我将感兴趣的是您如何设置该查询以获取输入的类ID的类书籍,以及其交叉列表

另一种选择似乎是为每个交叉列表存储Class_Books数据。。我不想使用这种方法,因为我上传到数据库的原始类和类书数据不适用于此,因为每个类都有单独的文件,并且只有一个交叉列表链接到类书文件中的一本书。而且,即使这种方法很容易实现,也会占用更多的数据库空间

如果您不同意我的交叉登录方法,我愿意接受其他选择。就像我说的,如果你同意这种方法,那么请帮我提出一个问题


注意:类书的结构仅为Class_ID,Book_ID

如果您必须在两者之间进行选择,请使用第一个选项。你不想在课本上有表面上重复的条目。这会给你带来各种各样的问题

更新,因为您希望类ID位于where子句中,我已经更新了它

至于查询,这是我将如何搜索书籍

SELECT DISTINCT books.*
FROM
    classes main
    LEFT JOIN classes crosslinked
    ON main.Class_id = crosslinked.cross_link_class_id
    LEFT JOIN class_books books
    ON main.class_id =  books.class_id
WHERE
    main.class_id= 252
    OR
    crossLinked.class_id= 252 
但你应该接受ijw的观点。最好只是有一个与类关联的class_names表。那会干净一点。那么你就不必做这样的逻辑:如果cross\u link\u class\u id不为null,那么就不允许学生注册,教授不能教授cross\u link\u class\u id为null的课程。毕竟,你不会希望意外地超额预订一个课程或将教授记录为教学的课程数量增加一倍

下面是如何使用一个单独的类名表完成的

SELECT DISTINCT books.*
FROM
    classes 
    --LEFT JOIN class_names names
    --ON main.Class_id = names.Class_id 
    LEFT JOIN class_books books
    ON main.class_id =  books.class_id
WHERE
   clases.class_id  = 252 
请注意,OR语句已经消失,并且没有任何有趣的、会让人困惑的自连接,前面提到的空cross_link_class_id上的逻辑也消失了


注意:我对查询做了一些修改,例如文字字符串将替换为参数。您不会选择*而是使用实际的字段名。

如果上面的两个类实际上是一个具有两个名称的类,那么为其设置两个类条目在逻辑上似乎是错误的。你有什么理由希望这样做,而不是从类中删除代码并单独存储,这样一个类就可以有1+个Class_代码?所以基本上你建议使用一个Class_列表表,与Class表分开,然后用户会搜索类目列表,它会加入到类目中以获取图书?当用户搜索时,他们会通过表单发送类目ID,我们从自动完成中知道类目ID。。对于第二个查询,WHERE条件是否为WHERE Class_Name_ID=17?@babonk。我已经更新了我的答案。第二个查询变得更容易,因为与类_名称的连接被完全删除。这对于任何基于类id的查询都是正确的