Мой вопрос основан на следующей статье (таблица и функцияierarchy_connect_by_parent_eq_prior_id) http://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/
Предположим, что таблица t_hierarchy имеет два дополнительных поля (кроме id и parent) typ1 (char) и время(INT).поле typ1 может иметь два значения A и B. Моя цель - показать все дерево, как описано в статье, но мне нужно дополнительное поле в результате, которое отображает время текущего узла (если typ1 = B) и всехего потомков (если typ1 = B).Поэтому мне нужна сумма времени всех потомков для определенного узла (включая самого себя), когда typ1 = B.
У меня есть следующее решение, но оно слишком медленное:
основной запрос:
SELECT CONCAT(REPEAT(' ', level - 1), hi.id) AS treeitem, get_usertime_of_current_node_and_descendants(hi.id) as B_time,
hierarchy_sys_connect_by_path('/', hi.id) AS path,
parent, level
FROM (
SELECT hierarchy_connect_by_parent_eq_prior_id(id) AS id,
CAST(@level AS SIGNED) AS level
FROM (
SELECT @start_with := 0,
@id := @start_with,
@level := 0
) vars, t_hierarchy
WHERE @id IS NOT NULL
) ho
JOIN t_hierarchy hi
ON hi.id = ho.id
Функция get_usertime_of_current_node_and_descendants (input int):
BEGIN
DECLARE _id INT;
DECLARE _desctime INT;
DECLARE _nodetime INT;
SET _id = input;
select COALESCE((select sum(time) from (
SELECT hi.id, time,typ1
FROM (
SELECT hierarchy_connect_by_parent_eq_prior_id_2(id) AS id, @levela AS level
FROM (
SELECT @start_witha := _id,
@ida := @start_witha,
@levela := 0,
) vars, t_hierarchy a
WHERE @ida IS NOT NULL
) ho
JOIN t_hierarchy hi
ON hi.id = ho.id
) q where typ1 = 'B'), 0) into _desctime;
select COALESCE((select time from t_hierarchy where id = _id and typ1='B'), 0) into _nodetime;
return _desctime + _nodetime;
END $$
Функцияierarchy_connect_by_parent_eq_prior_id_2 такая же, как в статье, и как у вышеприведенной иерархии_connect_by_, она есть, как и у других переменных, но она имеет разные имена, но она естьоно не будет мешать тем, которые используются в основном запросе.
Приведенное выше решение работает по желанию, но оно слишком медленное (особенно при работе с большими наборами данных).Можете ли вы предложить лучшее решение или вы можете предложить, как улучшить запрос?Заранее спасибо за ваше время и помощь!