我不确定在mySQL中这是否可行.这是我的表: -
分类表:
ID
名称
parent_id(指向Categories.id)
我使用上表来映射所有类别和子类别.
产品表:
ID
名称
CATEGORY_ID
Products表中的category_id指向它所属的子类别ID.
例如,如果我有玩具>教育> ABC,其中ABC是产品,玩具是类别,教育是子类别,那么ABC将category_id为2.
现在的问题是我想使用SQL查询来显示特定类别的所有产品(在所有子类别及其子类别中.n级别).
例如:
select * from categories,products where category.name = 'Toys' and ....
上述查询应显示来自Educational的产品以及所有其他子类别及其子类别.
这是否可以使用mySQL查询?如果不是我有什么选择?我想避免PHP递归.
更新:基本上我想通过在产品表中添加命中列来显示主要类别中的前10个产品.
我在以前需要做同样事情的项目中做了什么,我添加了两个新列.
i_depth:类别有多深的int值
nvc_breadcrumb:以条带符号格式表示的类别的完整路径
然后我在表中添加了一个触发器,其中包含类别信息以执行以下操作(所有三个更新都在同一触发器中)...
-- Reset all branches UPDATE t_org_branches SET nvc_breadcrumb = NULL, i_depth = NULL -- Update the root branches first UPDATE t_org_branches SET nvc_breadcrumb = '/', i_depth = 0 WHERE guid_branch_parent_id IS NULL -- Update the child branches on a loop WHILE EXISTS (SELECT * FROM t_branches WHERE i_depth IS NULL) UPDATE tobA SET tobA.i_depth = tobB.i_depth + 1, tobA.nvc_breadcrumb = tobB.nvc_breadcrumb + Ltrim(tobA.guid_branch_parent_id) + '/' FROM t_org_branches AS tobA INNER JOIN t_org_branches AS tobB ON (tobA.guid_branch_parent_id = tobB.guid_branch_id) WHERE tobB.i_depth >= 0 AND tobB.nvc_breadcrumb IS NOT NULL AND tobA.i_depth IS NULL
然后只需在类别ID上与您的产品表进行联接,并执行"LIKE'%/ [CATEGORYID] /%'".请记住,这是在MS SQL中完成的,但它应该很容易转换为MySQL版本.
它可能只是兼容足够的剪切和粘贴(在表和列名称更改后).
扩大解释......
t_categories(现在看来)......
Cat Parent CategoryName 1 NULL MyStore 2 1 Electronics 3 1 Clothing 4 1 Books 5 2 Televisions 6 2 Stereos 7 5 Plasma 8 5 LCD
t_categories(修改后)......
Cat Parent CategoryName Depth Breadcrumb 1 NULL MyStore NULL NULL 2 1 Electronics NULL NULL 3 1 Clothing NULL NULL 4 1 Books NULL NULL 5 2 Televisions NULL NULL 6 2 Stereos NULL NULL 7 5 Plasma NULL NULL 8 5 LCD NULL NULL
t_categories(使用我给出的脚本后)
Cat Parent CategoryName Depth Breadcrumb 1 NULL MyStore 0 / 2 1 Electronics 1 /1/ 3 1 Clothing 1 /1/ 4 1 Books 1 /1/ 5 2 Televisions 2 /1/2/ 6 2 Stereos 2 /1/2/ 7 5 LCD 3 /1/2/5/ 8 7 Samsung 4 /1/2/5/7/
t_products(就像你现在一样,没有修改)......
ID Cat Name 1 8 Samsung LNT5271F 2 7 LCD TV mount, up to 36" 3 7 LCD TV mount, up to 52" 4 5 HDMI Cable, 6ft
加入类别和产品(类别为C,产品为P)
C.Cat Parent CategoryName Depth Breadcrumb ID p.Cat Name 1 NULL MyStore 0 / NULL NULL NULL 2 1 Electronics 1 /1/ NULL NULL NULL 3 1 Clothing 1 /1/ NULL NULL NULL 4 1 Books 1 /1/ NULL NULL NULL 5 2 Televisions 2 /1/2/ 4 5 HDMI Cable, 6ft 6 2 Stereos 2 /1/2/ NULL NULL NULL 7 5 LCD 3 /1/2/5/ 2 7 LCD TV mount, up to 36" 7 5 LCD 3 /1/2/5/ 3 7 LCD TV mount, up to 52" 8 7 Samsung 4 /1/2/5/7/ 1 8 Samsung LNT5271F
现在假设products表更完整,以便每个类别中都有东西而没有NULL,你可以做一个"Breadcrumb LIKE'%/ 5 /%'"来获取我提供的最后一个表的最后三项.请注意,它包括该类别的直接项目和子项(如三星电视).如果您只想要特定的类别项目,只需执行"c.cat = 5".
我认为实现这一目标的最简洁方法是使用嵌套集模型.它实现起来有点复杂,但功能强大.MySQL有一个名为在MySQL中管理分层数据的教程.其中一位大型SQL大师Joe Celko 在这里写了同样的事情.如果您需要更多信息,请查看Troel关于存储分层数据的链接.
在我的情况下,我将远离使用RDBMS存储此类数据并使用图形数据库,因为在这种情况下数据实际上是有向图.