【问题标题】:representing an entity which has variable length of categories and sub categories表示具有可变长度类别和子类别的实体
【发布时间】:2015-07-14 11:53:03
【问题描述】:

我有一个品牌类别,必须在选择特定类别时显示。最重要的是,如果我选择一个子类别,则必须根据子类别过滤品牌列表。另一个问题是子类别的层次结构因产品而异。

品牌表:

 Brand_id|brand_name
 101     | xyz

brand_cat 表:

 brand_id| category_id
 101     | 001
 101     | 011
 101     | 111

分类表”

 cat_id| parent_id
 001   | -
 011   | 001
 111   | 011 

在示例中:brand_cat 表有很多冗余。但我需要根据我选择的类别或/和子类别显示品牌。
如果我的表结构是正确的。我将如何根据所选类别提取品牌。

【问题讨论】:

  • 据我所知,如果没有客户端循环或存储过程,它不能纯粹在 MySQL 中完成。 (从技术上讲,如果您知道最大“深度”,则可以通过加入类别表“深度”次来使用单个查询来完成;但即便如此,获得内部类别“节点”也会有点困难。)
  • 深度是问题所在。但是深度是有限制的。好像四级左右。会有帮助吗?

标签: mysql sql relational-database


【解决方案1】:

你试过了吗……

SELECT brand_name
FROM brand_cat, brands
WHERE category_id='011' AND
      brands.Brand_id=brand_cat.brand_id

?

编辑:也获取子类别

SELECT brand_name
FROM brand_cat, brands, (SELECT cat_id
                         FROM category
                         WHERE parent_id='011') t
WHERE brand_cat.category_id='011' AND
      Brands.Brand_id=brand_cat.brand_id AND
      Brands.Brand_id=t.cat_id

【讨论】:

  • 这是我正在使用的当前代码。但我更担心brand_cat表中的数据冗余。想知道是否有另一种方法可以在您不知道深度的情况下存储此类数据。
【解决方案2】:

我认为这应该为您提供品牌的所有类别及其子类别...只要深度不超过 4:

SELECT t1.node_id
FROM treenode_table AS n0
INNER JOIN treenode_table AS t1 ON n0.node_id = t1.node_id OR n0.node_id = t1.parent_node_id
WHERE n0.parent_node_id = @originalNode
UNION
SELECT t2.node_id
FROM treenode_table AS n0
INNER JOIN treenode_table AS t1 ON n0.node_id = t1.parent_node_id
INNER JOIN treenode_table AS t2 ON t1.node_id = t2.parent_node_id
WHERE n0.parent_node_id = @originalNode
UNION
SELECT t3.node_id
FROM treenode_table AS n0
INNER JOIN treenode_table AS t1 ON n0.node_id = t1.parent_node_id
INNER JOIN treenode_table AS t2 ON t1.node_id = t2.parent_node_id
INNER JOIN treenode_table AS t3 ON t2.node_id = t3.parent_node_id
WHERE n0.parent_node_id = @originalNode
UNION
SELECT t4.node_id
FROM treenode_table AS n0
INNER JOIN treenode_table AS t1 ON n0.node_id = t1.parent_node_id
INNER JOIN treenode_table AS t2 ON t1.node_id = t2.parent_node_id
INNER JOIN treenode_table AS t3 ON t2.node_id = t3.parent_node_id
INNER JOIN treenode_table AS t4 ON t3.node_id = t4.parent_node_id
WHERE n0.parent_node_id = @originalNode
;

好的,经过大量编辑后,应该可以了。 (我已经概括了它,因为我根据我拥有的类似数据对其进行了测试。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    相关资源
    最近更新 更多