Ale*_*art 1 php mysql database
我不确定在mySQL中这是否可行.这是我的表: -
分类表:
我使用上表来映射所有类别和子类别.
产品表:
Products表中的category_id指向它所属的子类别ID.
例如,如果我有玩具>教育> ABC,其中ABC是产品,玩具是类别,教育是子类别,那么ABC将category_id为2.
现在的问题是我想使用SQL查询来显示特定类别的所有产品(在所有子类别及其子类别中.n级别).
例如:
select * from categories,products where category.name = 'Toys' and ....
Run Code Online (Sandbox Code Playgroud)
上述查询应显示来自Educational的产品以及所有其他子类别及其子类别.
这是否可以使用mySQL查询?如果不是我有什么选择?我想避免PHP递归.
更新:基本上我想通过在产品表中添加命中列来显示主要类别中的前10个产品.
我在以前需要做同样事情的项目中做了什么,我添加了两个新列.
然后我在表中添加了一个触发器,其中包含类别信息以执行以下操作(所有三个更新都在同一触发器中)...
-- 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
Run Code Online (Sandbox Code Playgroud)
然后只需在类别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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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/
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
加入类别和产品(类别为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
Run Code Online (Sandbox Code Playgroud)
现在假设products表更完整,以便每个类别中都有东西而没有NULL,你可以做一个"Breadcrumb LIKE'%/ 5 /%'"来获取我提供的最后一个表的最后三项.请注意,它包括该类别的直接项目和子项(如三星电视).如果您只想要特定的类别项目,只需执行"c.cat = 5".
我认为实现这一目标的最简洁方法是使用嵌套集模型.它实现起来有点复杂,但功能强大.MySQL有一个名为在MySQL中管理分层数据的教程.其中一位大型SQL大师Joe Celko 在这里写了同样的事情.如果您需要更多信息,请查看Troel关于存储分层数据的链接.
在我的情况下,我将远离使用RDBMS存储此类数据并使用图形数据库,因为在这种情况下数据实际上是有向图.
| 归档时间: |
|
| 查看次数: |
3401 次 |
| 最近记录: |