Порядок результата самовосстановления в MySQL, когда родитель не существует

У меня есть таблица с именем 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 результат

как вы видите, классы показывают правильно с полем год под годом,

в первом ряду год находится под полем класса (смещено на 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 года со всеми факультетами, студентами и классами, более 100 тысяч сообщений, связанных с пользователем / классом, более 10 тысяч пользователей и до сих пор работали без сбоев!)

2 ответа

Решение

Я не знаю, каким должен быть ваш вывод, и я не знаю, как ваш запрос должен его получить, и я не знаю, как вы кодируете какую информацию в вашей таблице, но я подозреваю, что запрос ниже приведен результат, который вы хотите, и что он несколько избыточен (а именно последние 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'

Они смещаются влево, и вы делаете left JOIN, Это ключ. Я предлагаю изменить его только join, Когда вы выполняете left JOIN Вы получаете все строки из левой таблицы вместе с соответствующими строками из правой таблицы. Если в правой таблице нет соответствующих столбцов, он возвращает значения NULL.

Места смещения столбцов являются новыми для меня (хотя здесь не эксперт по SQL), но мне кажется, что это может быть связано с тем, что вы извлекаете все данные из одной таблицы taxonomys,

Другие вопросы по тегам