父类别的所有子类别列表

时间:2016-02-01 22:03:04

标签: mysql sql hierarchical-data recursive-query

此功能目前从父级获得一级别的子级别。我们知道父($ category_id),它检查子类别并正确返回结果。

// list category for the category (type)
function getCategoryItemsList($category_id) {

$cat_list = $category_id;

// check for child category
 $sql = "select category_id from category where category_parent_id = $category_id "; 
 $cat_ids = getSqlResult($sql, SQL_RESULT_ALL);

 foreach($cat_ids as $item) {
$cat_list = $cat_list . ',' . $item['category_id'];
 }
 return $cat_list;
}

问题在于我们有多个类别级别,如:

父母>孩子>祖母>大 - 大 - 孩子

如何返回父母的所有子类别级别?

///// MYSQL CATEGORY DB
category_id    category_name          category_parent_id
 1             shoes                  0
 2             blue shoes             1
 3             men blue shoes         2
 4             men blue shoe small    3
 5             red shoes              1
 6             men red shoes          5
 7             shirts                 0  

$ category_id =' 1'时的预期结果将是2,3,4,5,6

2 个答案:

答案 0 :(得分:1)

试试这个:

create table category(
  id        int,
  name      varchar(100),
  parent_id int
);

insert into category values
  (1, 'shoes', 0),
  (2, 'blue shoes', 1),
  (3, 'men blue shoes', 2),
  (4, 'men blue shoe small', 3),
  (5, 'red shoes', 1),
  (6, 'men red shoes', 5),
  (7, 'shirts', 0);

SELECT GROUP_CONCAT(lv SEPARATOR ',') FROM (
SELECT @pv:=(SELECT GROUP_CONCAT(id SEPARATOR ',') FROM category WHERE
FIND_IN_SET(parent_id, @pv)) AS lv FROM category
JOIN (SELECT @pv:=1)tmp
WHERE parent_id IN (@pv)) a;

输出:

mysql> SELECT GROUP_CONCAT(lv SEPARATOR ',') FROM (
    -> SELECT @pv:=(SELECT GROUP_CONCAT(id SEPARATOR ',') FROM category WHERE
    -> FIND_IN_SET(parent_id, @pv)) AS lv FROM category
    -> JOIN (SELECT @pv:=1)tmp
    -> WHERE parent_id IN (@pv)) a;
+--------------------------------+
| GROUP_CONCAT(lv SEPARATOR ',') |
+--------------------------------+
| 2,5,3,6,4                      |
+--------------------------------+
1 row in set (0.00 sec)

SQLFiddle demo

此解决方案基于that answer

答案 1 :(得分:0)

我所知道的最好(也许是唯一的)方式,如果你需要检索具有任意高度的树状父/子结构的表中的所有父项或子项,则使用递归查询。一开始可能有点难以理解,但是一旦你开始工作,这是一项很棒的练习和一种迷人的方式。这里有解释和示例:https://technet.microsoft.com/en-us/library/ms186243(v=sql.105).aspx

编辑: 您提出的问题可能存在概念上的错误。我认为一个类别可以有多个孩子,查询不能知道"选择哪个孩子,因此将选择所有孩子。在您的示例中,只有一个孩子。类别,在这种情况下查询有效,但您应该牢记这一假设。但是,在下面的查询中只选择每个类别的父级是相当容易的。 这是我的建议:

BEGIN
WITH ct
AS (
    SELECT c1.Id,
        0 Step,
        c1.ParentCategoryId
    FROM _Category c1
    WHERE c1.Id = 132

    UNION ALL

    SELECT c2.Id,
        ct.Step + 1,
        c2.ParentCategoryId
    FROM _Category c2
    JOIN ct
        ON c2.ParentCategoryId = ct.Id
    )
SELECT ct.Id,
    ct.Step
FROM ct;
END