mysql - 父类别的所有子类别列表

标签 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;
}

问题是当我们有多个类别级别时,例如:

parent > child >孙子>曾孙

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

///// 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 时的预期结果

最佳答案

试试这个:

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

关于mysql - 父类别的所有子类别列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35141255/

相关文章:

php - 根据表单输入更改 SQL "Where"子句

mysql - 如何使用 SQL 在 magento 中获取产品 ID 和 sku

php - Mysql 创建数据库失败(有点)

mysql - 如何在子查询返回多行的情况下执行子查询?

asp.net - 用于在自连接表中的嵌套 <ul> 中显示无限类别树的逻辑

MySQL层次结构数据抽取

php - 用另一个查询的随机值更新mysql表?

mysql - 过滤表中的记录,这些记录在四个国家代码列中至少有三个具有不同的国家代码

php - "Key column ' 用户名 ' doesn' t 存在于表中”

mysql - 如何创建MySQL分层递归查询