Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день!
Есть таблица с полями ID и Parent_Id.
Нужно получить всех потомков для всех родителей и уровень вложенности (Level) начиная от самого верха Parent_Id = NULL
У меня получить решить это только двумя рекурсивными запросами (см. ниже). Возможно ли обойтись одним?
Неактивен
т.е все возможные пары (потомок,родитель) + уровень потомка?
тогда 1 рекурсия для расчета уровня и декартово произведение за вычетом совпадений
что-то типа:
Неактивен
Спасибо, конечно, но просто декартово множество мне не нужно.
Нужно именно реальные связи родителя и потомков. Что этот родитель имеет таких потомков и их уровень.
Неактивен
ага, я уже сам утром понял, что глупость ночью написал
можно одной рекурсией получить (потомок, уровень, список родителей через запятую)
а потом декартово произведение и удаление лишних через find_in_set
sqlfiddle предоставляет только MySQL 5.6, поэтому пример для postgre - http://sqlfiddle.com/#!17/cb58e/14
Неактивен
Спасибо, но лучше уж больше текста, но быстрее.
Приоритет, конечно, это скорость выполнения. К сожалению, даже в моем варианте это далеко не идеально - не используются индексы, при использовании этого запроса.
ЗЫ
string_to_array - думаю, будет проблематично использовать для MySql.
Неактивен
klow написал:
string_to_array - думаю, будет проблематично использовать для MySql.
зато в MySQL есть find_in_set
klow написал:
К сожалению, даже в моем варианте это далеко не идеально - не используются индексы, при использовании этого запроса.
емнип, к cte применяются те же оптимизации, что и для производных таблиц - индексация создаваемой временной таблицы (и даже может построить несколько разных индексов, если cte упоминается в запросе неоднократно)
возможно у вас маленькая выборка и оптимизатор решает сделать перебор, чем строить индекс
Неактивен