Как обходятся модели вложенных множеств в MySQL? - PullRequest
0 голосов
/ 15 сентября 2009

Я читаю эту статью и на части с запросом:

SELECT node.name
FROM nested_category AS node,
nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND parent.name = 'ELECTRONICS'
ORDER BY node.lft;

Мне интересно, как он путешествовал? Что происходит шаг за шагом? Я в замешательстве, пожалуйста, помогите.

1 Ответ

3 голосов
/ 15 сентября 2009

Хорошо, система баз данных может выполнить запрос несколькими разными способами с одинаковым результатом, но вот один из способов понять, что происходит:

Возьмите 2 копии таблицы nested_category, одну с именем parent и другую с именем node. Найдите строку в parent с именем ELECTRONICS (статья, на которую вы ссылаетесь, подразумевает, что есть только одна). Диапазон parent.lft to parent.rgt дает любые узлы с ELECTRONICS в качестве предка в дереве на любой глубине.

Сортировка по node.lft означает, что сначала вы получите подузлы ELECTRONICS вдоль левой стороны поддерева, в обходе предварительного заказа .

Возможно, будет проще пройти простой пример, чтобы понять это: что если мы выберем ТЕЛЕВИДЕНИЯ вместо ЭЛЕКТРОНИКИ в качестве родителя:

Родительский набор содержит только 1 строку из-за [parent.name = 'TELEVISIONS']:

{ name: "TELEVISIONS", lft: 2, rgt: 9 }

В наборе 'node' есть 4 строки, которые удовлетворяют [node.lft между 2 и 9], потому что мы можем заменить одиночные значения lft / rgt из parent:

{ name: "TELEVISIONS", lft: 2, rgt: 9 }
{ name: "TUBE",        lft: 3, rgt: 4 }
{ name: "LCD",         lft: 5, rgt: 6 }
{ name: "PLASMA",      lft: 7, rgt: 8 }

И, как вы можете видеть, вышеупомянутые 4 строки уже отсортированы по значениям "lft", поэтому для удовлетворения запроса мы просто берем значения имени и все готово.

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