如何在MySQL中进行递归自联接

时间:2015-07-01 18:11:06

标签: mysql join recursion view

我正在建立一个需要制作收集清单的网上商店。 问题是我有3种产品和一个递归表(无限)。 即产品,选项和类别,类别是递归的。

我正在尝试使用字段Order.idOrderProduct.productComponent.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 - 明显
  • label - 另一个表中名称的ID
  • parent - 上述类别
  • 的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

1 个答案:

答案 0 :(得分:0)

没有真正的方法(至少我知道)在MySQL中进行“递归”连接。如果你有这样的表结构,我所知道的最好的解决方案是使用存储过程循环并“收集”相关的行和/或构建“路径”;遗憾的是,您无法加入存储过程的结果,因此通常意味着将该数据放入预定的临时表中,以便在执行该过程后使用。

或者,您可以在代码中分析递归表以确定其当前的“深度”,以便以编程方式组合查询。