【发布时间】:2015-07-01 18:11:06
【问题描述】:
我正在建立一个需要生成收集列表的网上商店。 问题是我有 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`
我的表格类别如下所示:
- id - 很明显
- 标签 - 另一个表中名称的 ID
- parent - 上面放置Category的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
【问题讨论】:
-
会话变量是 MySQL 中的黑魔法。除非您绝对别无选择,否则不要使用它们。改为在客户端进行递归。
-
我不像@Quassnoi 那样对会话变量过敏,但即使是我也会犹豫。在这么多不同的子句中使用同一个子句通常是一个非常非常非常糟糕的主意。
-
我也读过,但因为我使用视图,所以我看不到其他选择。 (如果它可以在视图中工作)。