LINUX.ORG.RU

Рекурсивный SQL-запрос

 , ,


0

2

Есть табличка:

id    pid    cat
---------------------------
1      1     Animals
2      2     Flowers
3      1     Cat
4      1     Dog
5      2     Forget me not
6      3     Begemot 
---------------------------

Как написать рекурсивный запрос, чтобы получить строку вида

Animals Cat Begemot

★★★★★

Последнее исправление: int13h (всего исправлений: 4)

Выполнить 3 запроса

goingUp ★★★★★
()

Не пользоваться mysql. Я попробовал лет 5 назад перейти на PostgreSQL, с тех пор ни малейшего желания возвращаться. Точно помню, что 4-5 лет назад средствами mysql нельзя было написать рекурсивный запрос, а на постгресе было можно.

pef-secure
()

ищи celko tree sql

и вообще у него 3 книжки об этом

qulinxao ★★☆
()

По твоей табличке неудобно строить рекурсию, так как у корневых азаписей pid == id, а, по идее, pid у таких записей должен быть pid == 0.

Вот вариант для PostgreSQL:

WITH RECURSIVE recursive_query ( id, parent_names ) AS (
	SELECT id, NULL::text[] || name FROM testtable WHERE parent = 0
	UNION ALL
	SELECT cq.id, parent_names || cq.name FROM testtable cq JOIN recursive_query pq ON pq.id = cq.parent
) SELECT parent_names FROM recursive_query;

Результат:

{Animals}
{Flowers}
{Animals,Cat}
{Animals,Dog}
{Flowers,"Forget me not"}
{Animals,Cat,Begemoth}
grondek
()
Ответ на: комментарий от grondek

Вот вариант для PostgreSQL

Его MySQL это поможет вряд ли. Что меня всегда удивляло, вроде дискуссии в виде веток принято на форумах показывать, а база часто мыскуэль.

pef-secure
()

Эээ, дык эцсамое. Тебе не надо рекурсивный запрос. Сделай бочку nested sets / closure table / materialized path

lovesan ★★
()
Ответ на: комментарий от grondek

Зато на PostgreSQL как кратенько выходит.

Он ваще рулит. Его планы исполнения поддаются разумной оптимизации, он не ломает коннекты каждые 24 часа, он не требует специальных флагов при коннекте, чтобы запросы типа update стали возвращать количество попавших под критерии апдейта записей, а не реально изменённых, я не припомню у него дедлоки на таблицах, в отличии от, с ним не требуется дебильная процедура восстановления потерянного рутового пароля... В общем, рулит, перечислять можно очень долго.

pef-secure
()

о, плюсую лавсана )
closure trees освоил - рульная вещь, скажу я вам! вставка чуть подороже выходит, за то выборка безо всяких рекурсий :)

aol ★★★★★
()

Как вариант рассмотрел рекурсивную выборку с помощью perl, но вопрос наверное упрется в нагрузку на сервер - это около 400 000 запросов. А если скачать эту таблицу и обрабатывать локально?

int13h ★★★★★
() автор топика
Ответ на: комментарий от pef-secure

Вообще я о штатном интерфейсе клиентской библиотеки для работы с БД. Тут что желай, что не желай, но, - что есть, то есть.

Sorcerer ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.