首页 > 解决方案 > 分层查询将中级类别分类为顶级

问题描述

我有一个包含 3 级分层数据的表,但是我的查询对级别进行了错误的分类。

我的查询:

SELECT  t1.name AS lev1, t2.name as lev2, t3.name as lev3
FROM sds_test AS t1
LEFT JOIN sds_test AS t2 ON t2.parent_id = t1.ID
LEFT JOIN sds_test AS t3 ON t3.parent_id = t2.ID;

博物馆和艺术学校类别正在增加一排,因为它们是顶级类别,这是我想要消除的。如果我把第 2 级不为 NULL,它会弄乱那些只有一个顶级级别的类别,例如航空

期望的结果博物馆和艺术学校不应该是顶级类别,也不应该有单独的行。

预期的实际结果

我不确定如何解决这个问题,因为 CTE 也得到了类似的结果。我尝试使用案例

case when parent_id = NULL then 这再次没有给我想要的结果。

重新生成表的 SQL 查询:

create table sds_test (id int, name varchar(30), parent_id int);
insert into sds_test values(1, 'Educational Institute', NULL);
insert into sds_test values(2, 'Speciality Schools', 1);
insert into sds_test values(3, 'Arts School', 2);

insert into sds_test values(4, 'Restraunts', NULL);
insert into sds_test values(5, 'Asian Restraunts', 4);
insert into sds_test values(6, 'malasian Rest', 5);

insert into sds_test values(7, 'Recreational', NULL);
insert into sds_test values(8, 'Museum', 7);

insert into sds_test values(9, 'Aviation', NULL);

标签: mysqlsql

解决方案


我认为你非常接近:

SELECT  t1.name AS lev1, t2.name as lev2, t3.name as lev3
FROM sds_test AS t1
LEFT JOIN sds_test AS t2 ON t2.parent_id = t1.ID
LEFT JOIN sds_test AS t3 ON t3.parent_id = t2.ID
WHERE t1.parent_id IS NULL

结果是:

lev1                    lev2                lev3    
Educational Institute   Speciality Schools  Arts School
Restraunts              Asian Restraunts    malasian Rest
Recreational            Museum              NULL
Aviation                NULL                NULL 

我所做的只是添加该项目t1不应有父项的条件。

这显然与所需的输出不匹配。我想知道为什么航空不应该在那里?


推荐阅读