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