【问题标题】:Select sub-categories from category where sub-cat has multiple parents从子猫有多个父母的类别中选择子类别
【发布时间】:2014-02-07 04:00:08
【问题描述】:

对不起,如果问题令人困惑,但是......

我的数据库中有一个类别 > 子类别排列(所有猫 + 子猫都在同一个表中)。

表格如下所示:

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# 是列表中的第一个时才会选择它。

我可能会出错的任何想法。或者,有更好的方法吗?

【问题讨论】:

  • 那么在一个记录中有多个父母,还是那个收发室家具有两个记录?
  • 在一条记录中,有两个(或更多)父母...
  • 通常情况下,将分隔的字符串列表作为另一个字段的外键(即使在同一个表中)是一个坏主意。绝对考虑将父/子移动到单独的关系表,例如:hierarchy_tbl: {parent_id, child_id} 两列都映射到您的主表中。另外,考虑从数据库中删除级别列。可以根据你已经知道的关系信息来计算。

标签: mysql sql


【解决方案1】:

首先我要问一下你们的关系。我的意思是,在理想世界中,您将有一个包含父类的表和一个将子类别分开的表,然后有一个连接这两者的临时表。

基于你提出这个问题的方式,我首先必须拒绝数据库设计缺陷,以及通过将它们拆分为标准化方法来重新设计这种关系的潜在可能性。

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

这仅适用于共享相同记录的两个父实体,除此之外它会变得很麻烦。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多