2014-02-06 106 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) 

这将仅适用于两家母公司的实体工作,如果它们共享相同的记录,超越它得到相当毛。