|
|
|
Как построть Materialized Path по Adjacency List
|
|||
|---|---|---|---|
|
#18+
есть таблица с 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.'; но это не совсем то, что хотелось бы получить может кто что посоветует ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2013, 23:44:16 |
|
||
|
Как построть Materialized Path по Adjacency List
|
|||
|---|---|---|---|
|
#18+
загвоздка как раз в том, что выборка данных из присоединенной таблицы materialized дает только те данные в запрос, которые были в таблице до обращения с этим запросом. Тоесть если до отправки данного запроса таблица была пуста, то на любом выбранном ряде значения полей из этой таблицы будут null не зависимо от того первый это ряд или сотый. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2013, 00:01:40 |
|
||
|
Как построть Materialized Path по Adjacency List
|
|||
|---|---|---|---|
|
#18+
ugodrus, 13675569 таблицу с суммами - фтопку на 0 уровне выбираете все элементы с парентид=нулл далее по тексту ну и в таблицу tmp_levels нужно сразу добавить поле под путь насчёт нумерации - прочитайте фак по переменным и на каждом шаге выборки нумеруйте полученные идшники (с разбивкой по группам, где №группы=парентид), ну а потом всё просто - путь_потомка = конкат(путь_родителя,".",номер_потомка) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2013, 06:17:11 |
|
||
|
Как построть Materialized Path по Adjacency List
|
|||
|---|---|---|---|
|
#18+
tanglir спасибо за мысль.. получилось то что надо и без процедуры. хотя может быть с ней было бы немного удобнее , но я решил оставить как есть. просто чуть подредактировал запрос. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. в итоге получилось то что надо. мало ли вдруг кому пригодится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2013, 13:51:21 |
|
||
|
Как построть Materialized Path по Adjacency List
|
|||
|---|---|---|---|
|
#18+
и тогда вдогонку ещё один вопросик.. так.. для общего развития. а что если бы таблицы из которых я делаю данный запрос были бы не myisam а innodb было бы возможным выполнить такое одним запросом при назначении последующего индекса в маршруте через дополнительный join к результирующей таблице и использование count(*)+1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2013, 14:10:09 |
|
||
|
Как построть Materialized Path по Adjacency List
|
|||
|---|---|---|---|
|
#18+
ugodrusв итоге получилось то что надоне пойму, в вашем дереве всего 2 уровня? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 06:14:39 |
|
||
|
Как построть Materialized Path по Adjacency List
|
|||
|---|---|---|---|
|
#18+
tanglir, в дереве 6 уровней. этот запрос я посылаю из пхп столько раз сколько вернёт SELECT MAX(lvl) FROM adjacency просто запрос универсальный благодаря if( pgr.id is null, @curindx:=@curindx+1, concat( ... и подходит как для первого так и для всех последующих уровней при отсутствии pgr.id в первом запросе он назначает path через @curindx:=@curindx+1 в остальных случаях таблица уже не пуста и он формирует path через конкатенацию пути родителя и текущего индекса ну самое весёлое конечно в этом запросе вычисление индекса для второго и последующих уровней через CASE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 07:25:37 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38386106&tid=1836119]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
47ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
2ms |
| others: | 204ms |
| total: | 332ms |

| 0 / 0 |
