【问题标题】:How can fetch data like a tree structure in mysql? [closed]如何在mysql中获取像树结构一样的数据? [关闭]
【发布时间】:2020-11-23 19:31:57
【问题描述】:

如果我搜索Pro,我需要获取Electronics > Mobile > Iphone > Pro 之类的数据。

也就是说,

Proparent_id3sibling_order3Iphone

Iphoneparent_id2sibling_order2Mobile

Mobileparent_id1sibling_order1Electronics

另一个例子:

如果我搜索Mobile,那么我需要获取Electronics/Mobile 之类的数据。

我尝试了递归查询,但它不起作用Syntax error

WITH RECURSIVE category_path (id, name, path) AS
(
  SELECT id, name, name as path
    FROM categories
    WHERE parent_id IS NULL
  UNION ALL
  SELECT c.id, c.name, CONCAT(cp.path, ' > ', c.name)
    FROM category_path AS cp JOIN categories AS c
      ON cp.id = c.parent_id
)
SELECT * FROM category_path
ORDER BY path;

任何帮助将不胜感激。

id  name              sibling_order  parent_id

1   Electronics             1         NULL
2   Mobile                  2          1
3   Iphone                  3          2
4   Pro                     4          3
5   SE                      5          3
6   XR                      6          3
7   Samsung                 7          2
8   Galaxy                  8          8
9   Note                    9          8
10  Home & Furniture        10        NULL
11  Kitchen Storage         11        11
12  Lunch Box               12        12
13  Living Room Furniture   13        11
14  Sofa                    14        13

【问题讨论】:

标签: mysql hierarchical-data recursive-query


【解决方案1】:

我通过创建一个调用递归过程的函数来解决它

DROP PROCEDURE IF EXISTS `spCategoryPath`;
DELIMITER //
CREATE PROCEDURE `spCategoryPath`(IN `categoryID` INT UNSIGNED, OUT `return_path` TEXT)
BEGIN
    DECLARE categoryName VARCHAR(50);
    DECLARE categoryParentId INT;
    DECLARE pathResult TEXT;
    SET max_sp_recursion_depth=50;

    SELECT name, parent_id INTO categoryName, categoryParentId FROM categories WHERE id=categoryID;

    IF ISNULL(categoryParentId) THEN
        SELECT categoryName INTO return_path;
    ELSE
        CALL spCategoryPath(categoryParentId, pathResult);
        SELECT CONCAT(pathResult, ' > ', categoryName) INTO return_path;
    END IF;
END //
DELIMITER ;


DROP FUNCTION IF EXISTS `fnCategoryPath`;
DELIMITER //
CREATE FUNCTION fnCategoryPath(`categoryID` INT) RETURNS TEXT DETERMINISTIC
BEGIN
       DECLARE pathResult TEXT;
       CALL spCategoryPath(categoryID, pathResult);
       RETURN pathResult;
END //
DELIMITER ;

函数是这样执行的:

SELECT fnCategoryPath(6);

生成以下结果:
电子 > 手机 > Iphone > XR

【讨论】:

    猜你喜欢
    • 2022-06-13
    • 2018-11-23
    • 2021-01-29
    • 2019-04-16
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    相关资源
    最近更新 更多