gpt4 book ai didi

当父级不存在时mysql自连接修复结果顺序

转载 作者:行者123 更新时间:2023-11-29 12:31:26 25 4
gpt4 key购买 nike

我有一个名为Taxonomy的表,它几乎包含与组织结构有关的所有内容。作为学校示例表,看起来像

id | name | type | parent
1 | 2014 | year | null
2 | igcse| dep | 1
3 | kg1 | grade| 2
4 | c1 | class| 3

4种类型,最上面的是学年(2014-2015)例如。在它的学校部门下,在它的年级下(年级1、2、3等)在它的多个类(class)下。

当我需要得到这个时,我运行一个像这样的自连接查询:

SELECT y.name AS year,
d.name AS dep,
g.name AS grade,
c.name AS class,
e.name AS exam
FROM `taxonomys` e
left JOIN `taxonomys` c on c.id = e.parent
left JOIN `taxonomys` g on g.id = c.parent
left JOIN `taxonomys` d on d.id = g.parent
left JOIN `taxonomys` y on y.id = d.parent
where c.type in ('grade','department','class','year')

它工作正常,除了我得到这么多空值!查询结果示例 mysql result

如您所见,类在年份字段下正确显示,

但在第一行,年份位于 Class 字段下(移动了 3 个单元格)。

只要有空值就会被移动。我该如何解决这个问题?

非常感谢

编辑

What is this table ?

邻接列表模型的变体,我添加了一个名为 type 的额外列,以便我可以识别任何行的级别,而无需检索整个路径。

表格保存了学校的结构。示例

在每个新的一年中,他们都会创建一个年度示例“2014-2015”,然后在今年内创建学校不同的部门“美国文凭、高中、幼儿园等..”,下面是学校成绩和每个年级来上课吧..

示例

id name        type   parent
1 2014-2015 year null
2 highschool dep. 1
3 grade 10 grade 2
4 grade 11 grade 2
5 class a class 3
6 class b class 3

这些输入意味着

   2014-2015
|__Highschool
|__ grade 10
|__ class a
|__ class b
|__ grade 11

在另一个表将学生链接到类(class)节点之后,另一个表将帖子链接到类(class),依此类推。

所以这张表基本上保存了学校的结构。由于年份、部门和年级仅用于组织学校用户“除了他们需要的名称之外没有任何数据”,我决定将所有内容都放在一张表中。

Why did you build it in this a very very very bad/anti-pattern design ?

它实际上对我来说非常有用!(我们与所有部门、学生和类(class)合作了 4 年,有超过 10 万个帖子链接到用户/类(class)和超过 1 万个用户,到目前为止工作顺利!)

最佳答案

我不知道你的输出应该是什么,我不知道你的查询应该如何获得它,我不知道你如何编码表中的信息,但我怀疑下面的查询给出了您想要的结果,并且它有点多余(即最后 4 行),并且您的设计确实非常非常反模式。

/*
rows y.n,d.n,g.n,c.n,e.n
where
taxonomies(y.i,y.n,'year',y.p)
AND taxonomies(d.i,d.n,'dep',y.i) AND taxonomies(g.i,g.n,'grade',d.p)
AND taxonomies(c.i,c.n,'class',g.i) AND taxonomies(e.i,e.n,'exam',c.i)
*/
SELECT y.name AS year,
d.name AS dep,
g.name AS grade,
c.name AS class,
e.name AS exam
FROM `taxonomys` y
JOIN `taxonomys` d on y.id = d.parent
JOIN `taxonomys` g on d.id = g.parent
JOIN `taxonomys` c on g.id = c.parent
JOIN `taxonomys` e on c.id = e.parent
WHERE y.type = 'year'
AND d.type = 'dep'
AND g.type = 'grade'
AND c.type = 'class'
AND e.type = 'exam'

关于当父级不存在时mysql自连接修复结果顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27436956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com