【问题标题】:Hierarchical Query is classifying the mid-level category as top level分层查询将中级类别分类为顶级
【发布时间】:2019-04-29 23:06:09
【问题描述】:

我有一个包含 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);

【问题讨论】:

  • 请显示您的实际结果和您想要的结果。
  • 添加了所需的结果

标签: mysql sql


【解决方案1】:

我认为你很接近:

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 中的项目不应该有父项的条件。

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

【讨论】:

  • 谢谢!!!是的,我非常接近,应该考虑一下。我相信图像被切断了。航空应该在那里。
  • 啊,我明白了。对表格和数据声明有疑问,这些都是经常缺失的,因此受到高度赞扬。可惜结果图片被裁剪了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
相关资源
最近更新 更多