Mysql 我是如何做到这一点的

Mysql 我是如何做到这一点的,mysql,sql,database,phpmyadmin,Mysql,Sql,Database,Phpmyadmin,我在数据库中有一个分类表和子分类表。其内部结构是: id int not null primary name text subcatfrom int 它包含类别及其子类别的一些行。我希望使用“SELECT”sql命令获取类别,并对每个根类别的子类别进行分组,例如: -cat1 --subcat1 --subcat2 -cat2 --subcat1 --subcat2 有可能吗?这很容易,但有了这种结构 Table: category_id , name , parent_id 样本数据

我在数据库中有一个分类表和子分类表。其内部结构是:

id int not null primary 
name text
subcatfrom int
它包含类别及其子类别的一些行。我希望使用“SELECT”sql命令获取类别,并对每个根类别的子类别进行分组,例如:

-cat1
--subcat1
--subcat2
-cat2
--subcat1
--subcat2

有可能吗?

这很容易,但有了这种结构

Table: category_id , name , parent_id
样本数据

category_id    name   parent_id
   1           A        0
   2           B        0
   3           C        1
   4           D        1
这意味着A是一个有2个子类别C和D的类别。父类别id 0意味着它是一个父类别 现在sql是

SELECT lc.category_id,
       lc.name,
       rc.subcategories
FROM categories
LEFT JOIN (
    SELECT  
        subcategory_id , 
        GROUP_CONCAT(name) AS subcategories  
    FROM categories)  AS rc 
ON lc.category_id = rc.parent_id
这将为您提供以下结果

category_id    name      subcategories
   1           A          C,D
   2           B          (null)

原始问题希望子类别位于单独的行上。这里有一个方法:

select name
from ((select category as name, 1 as iscat, category as sortorder
       from t
      ) union all
      (select tsub.category as name 0 as iscat, t.category as sortorder
       from t join
            tsub on
            on t.subcategory_id = s.category_id
      )
     ) a
where not exists (select 1 from category c where c.subcategory_id = a.sortorder limit 1) 
order by sortorder, iscat desc, name
这是干什么的?内部联盟all将所有类别和子类别集合在一起。它是在表中指定您想要的内容以及用于排序的信息。整体排序按“父”类别名称进行


where子句将这些数据限制在不属于任何其他类别的子类别中,即顶级类别。

我假设- 1.您只有一个级别的父子关系。ie子类别不能有更多子类别 2.对于顶级类别,subcatfrom的值为0

SELECT * FROM 
(
SELECT NAME AS parent_category_name, '' AS child_category_name FROM categories WHERE subcatfrom = 0
UNION
SELECT b.NAME AS parent_category_name, a.NAME AS child_category_name FROM categories a JOIN     categories b ON a.subcatfrom = b.id
) a ORDER BY a.parent_category_name, a.child_category_name;

也许是常见的表表达式?如果您是用PHP编码的,请查看@Tim Copper answer这个层次结构可以有多少层?你只限于2人吗?