powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как построть Materialized Path по Adjacency List
7 сообщений из 7, страница 1 из 1
Как построть Materialized Path по Adjacency List
    #38384784
ugodrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть таблица с Adjacency List:

ид_элемента
ид_его_родителя
уровень_вложенности

надо перекинуть данные из нее в таблицу под Materialized Path:

ид_элемента
путь_элемента
уровень_вложенности

и желательно чтобы нумерация элементов была последовательной т.е. 1,2,3,4 и 1.1, 1.2 соответственно

в принципе некоторое подобие у меня получилось через повторение запроса N раз, где N равно max(уровень_вложенности) таблицы с Adjacency List.

INSERT IGNORE INTO materialized (`ид_элемента`,`путь_элемента`,`уровень_вложенности`)
SELECT
`aj`.`ид_элемента`,
if(`aj`.`уровень_вложенности` = 1, `aj`.`ид_элемента`, concat( `ptg`.`путь_элемента` , "." , `aj`.`ид_элемента` )),
`aj`.`уровень_вложенности`
FROM `adjacency` `aj`
LEFT JOIN `adjacency` `ajp`
ON `ajp`.`ид_элемента` = `aj`.`ид_его_родителя`
LEFT JOIN `materialized` `ptg`
ON `ajp`.`ид_элемента` = `ptg`.`ид_элемента`
WHERE `aj`.`уровень_вложенности` = '.$i.';

но это не совсем то, что хотелось бы получить
может кто что посоветует
...
Рейтинг: 0 / 0
Как построть Materialized Path по Adjacency List
    #38384794
ugodrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
загвоздка как раз в том, что выборка данных из присоединенной таблицы materialized дает только те данные в запрос, которые были в таблице до обращения с этим запросом. Тоесть если до отправки данного запроса таблица была пуста, то на любом выбранном ряде значения полей из этой таблицы будут null не зависимо от того первый это ряд или сотый.
...
Рейтинг: 0 / 0
Как построть Materialized Path по Adjacency List
    #38384858
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ugodrus,

13675569
таблицу с суммами - фтопку
на 0 уровне выбираете все элементы с парентид=нулл
далее по тексту
ну и в таблицу tmp_levels нужно сразу добавить поле под путь
насчёт нумерации - прочитайте фак по переменным и на каждом шаге выборки нумеруйте полученные идшники (с разбивкой по группам, где №группы=парентид), ну а потом всё просто - путь_потомка = конкат(путь_родителя,".",номер_потомка)
...
Рейтинг: 0 / 0
Как построть Materialized Path по Adjacency List
    #38385394
ugodrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir спасибо за мысль..
получилось то что надо и без процедуры. хотя может быть с ней было бы немного удобнее , но я решил оставить как есть.
просто чуть подредактировал запрос.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
set @curppid:=null;
set @curindx:=0;
INSERT IGNORE INTO materialized (`idgroup`,`path`,`lvl`)
SELECT
	cgr.id idgrup,
	if( pgr.id is null, @curindx:=@curindx+1, concat(
		ptg.path, ".", case when @curppid = cgr.ppid then @curindx := @curindx + 1 else case when @curppid := cgr.ppid then @curindx := 1 else @curindx := 1 end end),
	cgr.lvl lvl
FROM adjacency cgr
LEFT JOIN adjacency pgr
ON pgr.pid = cgr.ppid
LEFT JOIN materialized ptg
ON pgr.id = ptg.idgroup
WHERE cgr.lvl = 2
ORDER BY cgr.ppid;



в итоге получилось то что надо. мало ли вдруг кому пригодится
...
Рейтинг: 0 / 0
Как построть Materialized Path по Adjacency List
    #38385432
ugodrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и тогда вдогонку ещё один вопросик.. так.. для общего развития.
а что если бы таблицы из которых я делаю данный запрос были бы не myisam а innodb
было бы возможным выполнить такое одним запросом при назначении последующего индекса в маршруте через дополнительный join к результирующей таблице и использование count(*)+1
...
Рейтинг: 0 / 0
Как построть Materialized Path по Adjacency List
    #38386094
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ugodrusв итоге получилось то что надоне пойму, в вашем дереве всего 2 уровня?
...
Рейтинг: 0 / 0
Как построть Materialized Path по Adjacency List
    #38386106
ugodrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, в дереве 6 уровней. этот запрос я посылаю из пхп столько раз сколько вернёт
SELECT MAX(lvl) FROM adjacency

просто запрос универсальный благодаря if( pgr.id is null, @curindx:=@curindx+1, concat( ...
и подходит как для первого так и для всех последующих уровней

при отсутствии pgr.id в первом запросе он назначает path через @curindx:=@curindx+1
в остальных случаях таблица уже не пуста и он формирует path через конкатенацию пути родителя и текущего индекса
ну самое весёлое конечно в этом запросе вычисление индекса для второго и последующих уровней через CASE
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как построть Materialized Path по Adjacency List
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]