Рекурсивно выбирая топовую рекурсию в MySQL - PullRequest
0 голосов
/ 03 декабря 2010

У меня есть таблица, которая содержит чисто отношения между группами для приложения, которое может иметь бесконечное количество подгрупп.

CREATE TABLE `shop_groups_group_rel` (
  `id_group` int(11) NOT NULL,
  `id_parent` int(11) NOT NULL,
  `type` enum('shop','group') NOT NULL
);

Тип "магазин" в основном означает самый верхний из них.

Теперь мне нужно иметь возможность получить самую верхнюю группу для ЛЮБОЙ группы, в которой я, возможно, разбираю. Я посмотрелв синтаксис LOOP MySQL, но я не могу понять, как смешать это с реальными запросами в базе данных.

Может кто-нибудь дать мне подсказку о том, как я могу рекурсивно выбрать родительскую группу, пока я не будув самой верхней группе?

Я знаю, что делать это может быть рискованно, потому что может быть бесконечное количество подгрупп, но на практике это никогда не будет больше, чем 2 или 3 подгруппы, и я легко могу установить жесткий пределна это.

Спасибо

1 Ответ

0 голосов
/ 04 декабря 2010

Если у вас все в порядке с жестким лимитом, вы можете просто использовать соединения.

SELECT id_group,
COALESCE(p4.id_group, p3.id_group, p2.id_group, p1.id_group, g.id_group) 
  as top_id_group
FROM shop_groups_group_rel g
LEFT JOIN shop_groups_group_rel p1 ON p1.id_group = g.id_parent
LEFT JOIN shop_groups_group_rel p2 ON p2.id_group = p1.id_parent
LEFT JOIN shop_groups_group_rel p3 ON p3.id_group = p2.id_parent
LEFT JOIN shop_groups_group_rel p4 ON p4.id_group = p3.id_parent

Это явно не рекурсивно, поэтому вы не можете продолжать бесконечно, но вы можете добавить столько объединений, сколько вы ожидаете в своем наборе данных. Это не очень быстро, но, по крайней мере, произойдет короткое замыкание, поскольку, как только вы достигнете верхнего родителя, оно пропустит остальные соединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...