Оптимизация таблицы самостоятельного соединения - PullRequest
1 голос
/ 28 ноября 2011

У меня есть стол, который я делаю самостоятельно.Моя примерная таблица выглядит такпервый уровень пользователя parent = 1.

Чтобы найти внука пользователя parent = 1, я ищу ребенка, который является потомком дочернего элемента parent parent = 1. Комуполучить правнука (3-й уровень), я ищу ребенка, который является ребенком, который является ребенком ребенка родителя = 1. ... и т. д.

Это может немного запутать, но мой запрос работает нормально.Мне было интересно, есть ли гораздо более быстрый / оптимизированный способ сделать это, поскольку я только повторяю свой sql повсюду.

-- Get Child
SELECT parent, child AS '1st Level' FROM genealogy WHERE parent=1;

-- Get Grandchild
SELECT a.parent, b.child AS '2nd Level' FROM (SELECT * FROM genealogy WHERE parent=1) a INNER JOIN genealogy b ON a.child=b.parent;

-- Get Great-Grandchild
SELECT a.parent, b.child AS '3rd Level' FROM (SELECT a.parent, b.child FROM (SELECT * FROM genealogy WHERE parent=1) a INNER JOIN genealogy b ON a.child=b.parent) a INNER JOIN genealogy b ON a.child=b.parent;

-- And the list goes on

1 Ответ

1 голос
/ 28 ноября 2011

Вы можете использовать другую древовидную структуру (называемую вложенным множеством):

-- Table genealogy
+--------+---------+------+-----+---------+-------+
| Field  | Type    | Null | Key | Default | Extra |
+--------+---------+------+-----+---------+-------+
| id     | int(11) | NO   | PRI | NULL    |       |
| lft    | int(11) | NO   | NO  | NULL    |       |
| rgt    | int(11) | NO   | NO  | NULL    |       |
+--------+---------+------+-----+---------+-------+

Это позволит вам выбрать ВСЕ дочерние элементы (и потомки, и потомки, и так далее) узла внутри дерева.

Например, чтобы выбрать всех детей генеалогии с идентификатором 1:

SELECT g2.*
FROM genealogy AS g1, genealogy AS g2
WHERE 
  (g1.lft BETWEEN g2.lft AND g2.rgt)
AND 
  (g1.id = 1);

Вы можете посмотреть на это для получения дополнительной информации и примеров: http://www.ibase.ru/devinfo/DBMSTrees/sqltrees.html

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