我在数据库中有一个用于类别和子类别的表。它的内部结构是:
id int not null primary
name text
subcatfrom int
它包含一些类别及其子类别的行。我希望“SELECT” sql 命令为每个根类别获取类别并在其后对它们的子类别进行分组,例如:
-cat1
--subcat1
--subcat2
-cat2
--subcat1
--subcat2
可能吗 ?
我在数据库中有一个用于类别和子类别的表。它的内部结构是:
id int not null primary
name text
subcatfrom int
它包含一些类别及其子类别的行。我希望“SELECT” sql 命令为每个根类别获取类别并在其后对它们的子类别进行分组,例如:
-cat1
--subcat1
--subcat2
-cat2
--subcat1
--subcat2
可能吗 ?
我的假设是- 1.您只有一个级别的父子关系。即子类别不能有进一步的子类别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;
这很容易,但是有了这种结构
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 的类别。而 parent_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
这是在做什么?内部联合全部是汇集所有类别和子类别。它在表格中分配您想要的内容以及用于排序的信息。整体排序是按“父”类别名称。
where 子句将这些数据限制为不属于其他任何子类别的类别——顶级类别。