2011-01-07 85 views
0

我有一個表類,它存儲不同大學班級(唯一的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

回答

0

如果你有兩間挑去的第一個選項。您不希望在課本中出現表面上重複的條目。這會給你帶來各種各樣的問題。

更新由於您希望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文字字符串將被替換爲一個參數。您不會選擇*,而是使用實際的字段名稱。