设置MySQL的交叉列表查询

问题描述:

我有一个表类,它存储不同大学班级(唯一的Class_ID和部门,课程等)的数据。设置MySQL的交叉列表查询

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

我想正确地存储交叉列表,以便当学生使用任何可能的交叉列表搜索课程的教科书(存储在Class_Books表中)时,会显示所需的书籍。这是而不是重要的是,当学生进行搜索时,学生是否知道其他交叉列表,只有他们获得该课程的书籍。

我想通过在Classes中存储一个Cross_List_ID来做到这一点,这将表明给定的类只是现有类的交叉列表,其Class_ID将存储在该字段中。然后,我只需要将交叉列出的Class_ID存储在所需的书籍(在Class_Books中)。然后,当学生在搜索中进入课程时,我会确保包含Cross_List_ID所需的所有书籍。如果您同意这是要走的路,我会对您如何设置该查询感兴趣(获取输入的class_id的课本以及其交叉列表)。

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

如果您不同意我的Cross_Listing_ID方法,我接受其他选项。就像我说的,如果你同意这种方法,那么请帮我查询一下!

注:类书籍的结构,就像类标识码,Book_ID

+0

如果您的上述两个类实际上是一个具有两个名称的类,那么为它创建两个Class条目看起来在逻辑上是错误的。你有没有这样做的原因,而不是从Class中移除代码并单独存储它们,以便Class可以有1 + Class_Codes? – ijw 2011-01-07 01:30:24

+0

所以基本上你会建议一个Class_Listings表,从Classes表中分离出来,然后用户会搜索Class_Listings,它会加入到Classes中以获取书籍? – babonk 2011-01-07 20:40:55

如果你有两间挑去的第一个选项。您不希望在课本中出现表面上重复的条目。这会给你带来各种各样的问题。

更新由于您希望Class 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_link_class_id不为空,那么不允许学生注册它,教授不能教一个cross_link_class_id为空的类,毕竟你不会想要无意中超额预订一堂课或者将教授被录制的班级数量增加一倍作为教学

以下是如何使用单独的班级名称表完成的。

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上述逻辑已经一去不复返了。

注:我已经采取了一些*与查询e。g文字字符串将被替换为一个参数。您不会选择*,而是使用实际的字段名称。