我正在建立一个需要制作收集清单的网上商店。 问题是我有3种产品和一个递归表(无限)。 即产品,选项和类别,类别是递归的。
我正在尝试使用字段Order.id
,OrderProduct.product
,Component.id
构建视图。
在这里你可以看到我已经拥有的东西,但是我删除了 - by选项的一部分,因为它没有“喂”这个例子。
CREATE VIEW `Gatherlist` as
SELECT `O`.`id`, `OP`.`product`, `C`.`id` FROM `Order` `O` -- By Product
LEFT JOIN `OrderProduct` `OP`
ON `O`.`id` = `OP`.`order`
LEFT JOIN `Product` `P`
ON `OP`.`product` = `P`.`id`
LEFT JOIN `ProductComponent` `PC`
ON `P`.`id` = `PC`.`product`
LEFT JOIN `Component` `C`
ON `PC`.`component` = `C`.`id`
UNION ALL
SELECT `O`.`id`, `OP`.`product`, `C`.`id` FROM `Order` `O` -- By Category
LEFT JOIN `OrderProduct` `OP`
ON `O`.`id` = `OP`.`order`
LEFT JOIN `Product` `P`
ON `OP`.`product` = `P`.`id`
-- LEFT JOIN `Category` `PC`
-- ON `P`.`category` = `PC`.`id`
-- Here should start a recursive join on Category
INNER JOIN (
SELECT group_concat(@id :=
(
SELECT id
FROM `Category`
WHERE parent = @id
)
) AS categoryTemp
FROM (
SELECT @id := 1
) vars
STRAIGHT_JOIN
`Category`
WHERE @id IS NOT NULL
) as `PC` on `P`.`category` = `PC`.`id`
-- And it will end somewhere again (i hope)
LEFT JOIN `CategoryCompenent` `CC`
ON `PC`.`id` = `CC`.`category`
LEFT JOIN `Component` `C`
ON `CC`.`component` = `C`.`id`
ORDER BY `O`.`id`, `OP`.`product`, `C`.`id`
我的表类别如下:
我找到了这个,但无法弄清楚如何将它放在一个连接中(在一个带有联合的视图中)。
SELECT group_concat(@id :=
(
SELECT id
FROM comments
WHERE parent_id = @id
)) AS comment
FROM (
SELECT @id := 1
) vars
STRAIGHT_JOIN
comments
WHERE @id IS NOT NULL
答案 0 :(得分:0)
没有真正的方法(至少我知道)在MySQL中进行“递归”连接。如果你有这样的表结构,我所知道的最好的解决方案是使用存储过程循环并“收集”相关的行和/或构建“路径”;遗憾的是,您无法加入存储过程的结果,因此通常意味着将该数据放入预定的临时表中,以便在执行该过程后使用。
或者,您可以在代码中分析递归表以确定其当前的“深度”,以便以编程方式组合查询。