0

我有一张名为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等)。

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

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结果

如您所见,课程在 year under year 字段中正确显示,

然而在第一行,年份在 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

之后,另一个表将学生链接到班级节点,另一个表将帖子链接到班级等等。

所以这张表基本上包含学校结构。由于年份、部门和年级仅用于组织学校用户“除了他们需要的姓名之外没有其他数据”我决定将所有数据放在一张表中。

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

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

4

2 回答 2

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'
于 2014-12-14T09:31:12.997 回答
0

他们正在向左移动,而您正在执行left JOIN. 这是一个线索。我建议将其更改为 only join。当您执行 a 时,left JOIN您将获得左表中的所有行以及右表中的匹配行。如果右表中没有匹配的列,则返回 NULL 值。

列移动位置对我来说是新的(虽然不是SQL专家),但在我看来,这可能与您从同一个表中检索所有数据的事实有关taxonomys

于 2014-12-14T09:28:07.343 回答