mysql - 分层查询将中级类别分类为顶级
问题描述
我有一个包含 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);
解决方案
我认为你非常接近:
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
不应有父项的条件。
这显然与所需的输出不匹配。我想知道为什么航空不应该在那里?
推荐阅读
- excel - 循环遍历表并删除数据
- ruby-on-rails - Rails 首先或初始化选择多个枚举
- sql-server - 从高级编辑器与数据转换转换更改数据类型
- angular - 如何强制 Angular 7+ Material Autocomplete 输入仅由数据源提供的字母?
- javascript - 如何在 Electron 中使用背景滤镜?
- angularjs - 如何在模式中设置自定义单选按钮的默认值
- javascript - 带有 $match 的聚合查询在 MongoDB Compass 中有效,但在我的 Node.js 应用程序中无效
- java - 将新数组分配给现有数组的正确方法
- html - 为什么当我弯曲父容器时 Chrome 会挤压我的文本?
- python - 如何消除负值并计算正整数的总和?