Я создаю базу данных для веб-сайта электронной коммерции, у которых есть вложенные категории, и я использую измененный предварительный переход algo. Мой вопрос, как я могу получить доступ ко всем узлам уровня 2 т.е. Статьи, Портфолио, КонтактMySQL - Как получить доступ ко всем узлам уровня 2 в таблице
ответ
The article прямо не говорит вам, как получить все узлы от одного уровня. Но если вы внимательно прочитаете это, он расскажет вам, как делать больше -> получить количество глубин каждой категории. Тогда все, что вам нужно сделать, это отфильтровать эту глубину.
SELECT node.name, (COUNT(parent.name) - 1) AS depth
FROM nested_category AS node, nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name
HAVING depth = 1
ORDER BY node.lft;
EDIT (что происходит):
Для того, чтобы использовать lft
и rgt
столбцов nested_category
таблицы следует выбрать таблицу дважды.
SELECT *
FROM nested_category AS node, nested_category AS parent
если вы проверяете этот запрос, вы увидите, что для каждой строки в nested_category
мы выбираем все строки снова. Итак, теперь мы хотим удалить все строки из первой таблицы (тот, который мы назвали AS node
), где они не являются дочерними из их parent
. Именно поэтому мы фильтруем с WHERE node.lft BETWEEN parent.lft AND parent.rgt
Я хочу отметить, что этот запрос:
SELECT *
FROM nested_category AS node, nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
ORDER BY node.lft;
равно
SELECT *
FROM nested_category AS node
LEFT JOIN nested_category AS parent ON (node.lft BETWEEN parent.lft AND parent.rgt)
ORDER BY node.lft;
Так что теперь у нас есть все ребенка с родителями + 1 (из-за пути процеживаем, каждый child
принадлежат к себе)
+-------------+----------------------+-----+-----+-------------+----------------------+------+------+
| category_id | name | lft | rgt | category_id | name | lft | rgt |
+-------------+----------------------+-----+-----+-------------+----------------------+------+------+
| 1 | ELECTRONICS | 1 | 20 | 1 | ELECTRONICS | 1 | 20 |
| 2 | TELEVISIONS | 2 | 9 | 1 | ELECTRONICS | 1 | 20 |
| 2 | TELEVISIONS | 2 | 9 | 2 | TELEVISIONS | 2 | 9 |
| 3 | TUBE | 3 | 4 | 1 | ELECTRONICS | 1 | 20 |
| 3 | TUBE | 3 | 4 | 3 | TUBE | 3 | 4 |
| 3 | TUBE | 3 | 4 | 2 | TELEVISIONS | 2 | 9 |
| 4 | LCD | 5 | 6 | 2 | TELEVISIONS | 2 | 9 |
| 4 | LCD | 5 | 6 | 1 | ELECTRONICS | 1 | 20 |
| 4 | LCD | 5 | 6 | 4 | LCD | 5 | 6 |
| 5 | PLASMA | 7 | 8 | 1 | ELECTRONICS | 1 | 20 |
| 5 | PLASMA | 7 | 8 | 5 | PLASMA | 7 | 8 |
| 5 | PLASMA | 7 | 8 | 2 | TELEVISIONS | 2 | 9 |
| 6 | PORTABLE ELECTRONICS | 10 | 19 | 6 | PORTABLE ELECTRONICS | 10 | 19 |
| 6 | PORTABLE ELECTRONICS | 10 | 19 | 1 | ELECTRONICS | 1 | 20 |
| 7 | MP3 PLAYERS | 11 | 14 | 7 | MP3 PLAYERS | 11 | 14 |
| 7 | MP3 PLAYERS | 11 | 14 | 1 | ELECTRONICS | 1 | 20 |
| 7 | MP3 PLAYERS | 11 | 14 | 6 | PORTABLE ELECTRONICS | 10 | 19 |
| 8 | FLASH | 12 | 13 | 1 | ELECTRONICS | 1 | 20 |
| 8 | FLASH | 12 | 13 | 8 | FLASH | 12 | 13 |
| 8 | FLASH | 12 | 13 | 6 | PORTABLE ELECTRONICS | 10 | 19 |
| 8 | FLASH | 12 | 13 | 7 | MP3 PLAYERS | 11 | 14 |
| 9 | CD PLAYERS | 15 | 16 | 1 | ELECTRONICS | 1 | 20 |
| 9 | CD PLAYERS | 15 | 16 | 9 | CD PLAYERS | 15 | 16 |
| 9 | CD PLAYERS | 15 | 16 | 6 | PORTABLE ELECTRONICS | 10 | 19 |
| 10 | 2 WAY RADIOS | 17 | 18 | 1 | ELECTRONICS | 1 | 20 |
| 10 | 2 WAY RADIOS | 17 | 18 | 10 | 2 WAY RADIOS | 17 | 18 |
| 10 | 2 WAY RADIOS | 17 | 18 | 6 | PORTABLE ELECTRONICS | 10 | 19 |
+-------------+----------------------+-----+-----+-------------+----------------------+------+------+
Следующий шаг - введите значение глубины. Для того, чтобы сделать это, мы должны группе каждого ребенка (в данном примере используется GROUP BY node.name
, но он также может быть сделано на node.category_id
и подсчитать количество parents
- 1 для каждой группы (COUNT(parent.name) - 1) AS depth
(ее также отлично использовать parent.category_id
вместо)
Так делают
SELECT node.*, (COUNT(parent.category_id) - 1) AS depth
FROM nested_category AS node
LEFT JOIN nested_category AS parent ON (node.lft BETWEEN parent.lft AND parent.rgt)
GROUP BY node.category_id
ORDER BY node.lft;
мы получаем это
+-------------+----------------------+-----+-----+-------+
| category_id | name | lft | rgt | depth |
+-------------+----------------------+-----+-----+-------+
| 1 | ELECTRONICS | 1 | 20 | 0 |
| 2 | TELEVISIONS | 2 | 9 | 1 |
| 3 | TUBE | 3 | 4 | 2 |
| 4 | LCD | 5 | 6 | 2 |
| 5 | PLASMA | 7 | 8 | 2 |
| 6 | PORTABLE ELECTRONICS | 10 | 19 | 1 |
| 7 | MP3 PLAYERS | 11 | 14 | 2 |
| 8 | FLASH | 12 | 13 | 3 |
| 9 | CD PLAYERS | 15 | 16 | 2 |
| 10 | 2 WAY RADIOS | 17 | 18 | 2 |
+-------------+----------------------+-----+-----+-------+
И теперь последний шаг, чтобы сказать, что мы хотим, только эти записи, которые имеют глубину = 1 (HAVING depth = 1
. HAVING
используется здесь, потому что он применяется после агрегатов (и поэтому он может фильтровать на агрегатах))
SELECT node.*, (COUNT(parent.category_id) - 1) AS depth
FROM nested_category AS node
LEFT JOIN nested_category AS parent ON (node.lft BETWEEN parent.lft AND parent.rgt)
GROUP BY node.category_id
HAVING depth = 1
ORDER BY node.lft;
+-------------+----------------------+-----+-----+-------+
| category_id | name | lft | rgt | depth |
+-------------+----------------------+-----+-----+-------+
| 2 | TELEVISIONS | 2 | 9 | 1 |
| 6 | PORTABLE ELECTRONICS | 10 | 19 | 1 |
+-------------+----------------------+-----+-----+-------+
Я надеюсь, что его более ясно. Снова извините за мой плохой английский, если я допустил некоторые ошибки.
- 1. C# доступ ко всем узлам html
- 2. Непериодический путь ко всем узлам
- 3. Доступ ко всем узлам в элементе управления TreeView
- 4. Валидатор Deform/Colander, который имеет доступ ко всем узлам?
- 5. Как я могу получить доступ ко всем элементам в NodeList?
- 6. Как получить доступ ко всем элементам класса?
- 7. Как получить доступ ко всем записям в таблице MySQL в представлении Django?
- 8. Не удалось получить доступ ко всем данным из таблиц mysql
- 9. Как добавить данные ко всем листовым узлам карты clojure?
- 10. Доступ ко всем запросам с уровня расширения хром
- 11. Как выбрать узел, ближайший ко всем другим узлам в графе?
- 12. xsl, доступ к узлам верхнего уровня
- 13. Где получить доступ ко всем «GameObjects»?
- 14. Я хочу иметь действие ко всем узлам treeview
- 15. Получить доступ ко всем свойствам стиля CSS.
- 16. Android, получить доступ ко всем уведомлениям
- 17. IE Получить доступ ко всем сайтам
- 18. Доступ ко всем связанным значениям
- 19. Доступ ко всем контроллерам директивы
- 20. Drupal 6 - Как отключить комментарии ко всем узлам/content_types?
- 21. Как предоставить пользователю доступ ко всем хранимым процедурам в mysql?
- 22. Как получить доступ ко всем глобальным переменным в функции python?
- 23. Доступ ко всем функциям argmuments
- 24. Найти узел по отношению ко всем узлам в коллекции
- 25. Доступ ко всем записям HttpParams
- 26. Как получить доступ ко всем UIButtons в UIScrollView в UIView?
- 27. Доступ ко всем DOM в Angularl2 RC
- 28. Как получить доступ ко всей таблице в объекте json
- 29. Поиск совпадений со всех узлов ко всем узлам в Neo4j
- 30. Выберите доступ ко всем таблицам
Что это за номера? Почему этот заказ? –
@MihaiIorga http: // imrannazar.com/Modified-Preorder-Tree-Traversal pls см. ссылку – Cody
С моей точки зрения, [это изображение] (http://i.imgur.com/FP8pXTZ.png) следует объяснить, как я рассматриваю структуру дерева категорий. Гораздо проще выбирать и получать узлы. Это будет просто 'SELECT * FROM категорий, где parent_id = 1' –