2014-02-06 140 views
0

很抱歉,如果這個問題是混亂的,但...選擇子類別的類別中,分貓有多個家長

我在數據庫中有一個類別>子類別設置(所有的貓+ subCats是在同一張桌子)。

的表是這樣的:

ID - AI id 
name - cat name 
parent - the parent of this category 
level - 1,2 or 3 

的問題是,某些類別可以有多個父母,這裏有一個例子:

id: 23 
name: furniture 
parent: null 
level: 1 

id: 26: 
name: mailroom 
parent: null 
level: 1 

id: 218 
name: bookcases 
parent: 23 
level: 2 

id: 262 
name: mailroom furniture 
parent: 23, 26 
level: 2 

所以,收發室的傢俱應該出現在類別的傢俱(23)和收發室(26) 我的SQL選擇子類別是這樣的:

SELECT name, parent 
FROM cat 
WHERE #thisCat.id# IN (parent) 

其中#thisCat.id#是父類別(例如, 23或26)

運行此操作時,如果子類別父級是列表(23,26),則只有當#thisCat.id#是列表中的第一個時纔會選擇它。

任何想法,我可能會出錯。或者,有沒有更好的方法來做到這一點?

+0

因此,在單個記錄中有多個父母,或者郵件室傢俱是否有兩個記錄? – Hituptony

+0

在單個記錄中,有兩個(或更多)父母... –

+0

通常,將字符串的分隔列表作爲另一個字段的外鍵(即使在同一個表中)是一個壞主意。絕對要考慮將父/子移動到單獨的關係表中,例如:hierarchy_tbl:{parent_id,child_id}這兩列映射到主表中。另外,考慮從數據庫中刪除級別列。它可以根據您已知的關係信息進行計算。 – 2014-02-06 20:08:56

回答

0

首先,我不得不問你的關係。我的意思是,在一個理想世界中,你將擁有一張擁有父母的桌子,以及一個將子類別分開的桌子,然後有一張加入這兩張桌子的臨時表格。

基於你提出這個問題的方式,我首先必須拒絕數據庫設計缺陷,並且通過將它們分解爲規範化的方法來重新設計這種關係。

SELECT name, LEFT(parent, INSTR(@parent, ',')-1), 
SUBSTR(parent,INSTR(parent, ',')+1,LENGTH(parent)) from cat WHERE thisCat.ID (**unspecified**) IN (parent) 

這將僅適用於兩家母公司的實體工作,如果它們共享相同的記錄,超越它得到相當毛。