Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Существует много методов от самых примитивных до очень сложных и возможно слишком сложных. Мы не будем описывать их в этой статье. При желании вы можете найти множество прекрасных обзорных статей в интернете “Google forever”.
Однако меня неудобства метода Joe Celko и побудили создать свой, совершенно отличный.
Мелкую иерархию и для вложенных можно внести.
А в чём проблема вывести дерево я не понял.
SELECT node.category_id, 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
ORDER BY node.lft
SELECT category_id, name, ord, dep FROM z_nested_category WHERE ord < (SELECT MAX(ord) FROM z_nested_category) ORDER by ord
SELECT node.id, node.name, node.level
FROM ns_tree AS node,
ns_tree AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND parent.id = 1
ORDER BY node.lft;
FROM ns_tree AS node, ns_tree AS parent
А в варианте Картезиус — подзапросы.
SELECT MAX(ord) FROM z_nested_category
SELECT category_id, name, ord, dep FROM z_nested_category ORDER by ord
SELECT MAX(ord) FROM z_nested_category
SELECT node.id, node.name, node.level
FROM ns_tree AS node
ORDER BY node.lft;
name left right node_0 1 14 node_0_1 2 7 node_0_1_1 3 4 node_0_1_2 5 6 node_0_2 8 11 node_0_2_1 9 10 node_0_3 12 13
name ord dep node_0 0 0 node_0_1 1 1 node_0_1_1 2 2 node_0_1_2 3 2 node_0_2 4 1 node_0_2_1 5 2 node_0_3 6 1
-- запрос имён узлов всего поддерева --
SELECT name , parent FROM ( TRAVERSE child FROM node )
Не совсем понял как хранить в таблице вложенные множества
CREATE PROCEDURE `sp_move`(
IN id_move_menu INT,
IN id_menu INT,
IN direct INT
)
BEGIN
DECLARE menu_ord INT;
DECLARE menu_dep INT;
DECLARE move_ord INT;
DECLARE move_dep INT;
DECLARE count_id INT;
DECLARE max_ord INT;
DECLARE rezult_ord INT;
DECLARE rezult_dep INT;
DECLARE max_ord_n INT;
DECLARE point_to_plus_ord INT;
SELECT COUNT(id) INTO count_id FROM tree
WHERE ord >= (SELECT ord FROM tree WHERE id =id_move_menu)
AND ord < (SELECT MIN(ord) FROM tree WHERE ord>(SELECT ord FROM tree WHERE id=id_move_menu) AND dep<=(SELECT dep FROM tree WHERE id=id_move_menu));
SELECT ord, dep INTO move_ord, move_dep FROM tree WHERE id = id_move_menu;
SELECT MIN(ord) INTO max_ord FROM tree WHERE ord>(SELECT ord FROM tree WHERE id=id_move_menu) AND dep<=(SELECT dep FROM tree WHERE id=id_move_menu);
UPDATE tree SET m_i = 1 WHERE ord >= move_ord AND ord < max_ord;
UPDATE tree SET ord = ord-count_id WHERE ord >= max_ord AND m_i = 0;
SELECT ord, dep INTO menu_ord, menu_dep FROM tree WHERE id=id_menu;
IF (direct=5) THEN
SET point_to_plus_ord=menu_ord;
ELSEIF (direct=6) THEN
SELECT MIN(ord) INTO max_ord FROM tree WHERE ord>(SELECT ord FROM tree WHERE id=id_menu) AND dep<=(SELECT dep FROM tree WHERE id=id_menu) AND m_i=0;
SET point_to_plus_ord=max_ord;
ELSEIF (direct=7) THEN
SET point_to_plus_ord=menu_ord+1;
END IF;
UPDATE tree SET ord = ord+count_id WHERE ord >= point_to_plus_ord AND m_i = 0;
IF (direct=5 || direct=6) THEN
UPDATE tree SET ord=ord-move_ord+point_to_plus_ord, dep=dep-move_dep+menu_dep WHERE m_i = 1;
ELSEIF (direct=7) THEN
UPDATE tree SET ord=ord-move_ord+point_to_plus_ord, dep=dep-move_dep+menu_dep+1 WHERE m_i = 1;
END IF;
UPDATE tree SET m_i=0 WHERE m_i=1;
END$$
Cartesius — метод хранения и извлечения древовидных структур в реляционных базах данных или SQL деревья без червей и тараканов