parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Ответ

G_Z 15.04.2016 13:43

Если очень хочется достать готовые адреса, то я бы сделал отдельный метод, который бы возвращал пути указанных узлов:
@getURLs[pages]
$result[^hash::sql{
	SELECT t.page_id, GROUP_CONCAT(t.ancestor_id ORDER BY t.distance DESC SEPARATOR '/') AS url
	FROM tree AS t
	WHERE 1
		AND t.page_id IN (^pages.menu{$pages.page_id}[,])
		AND t.ancestor_id > 0
	GROUP BY t.page_id
}]
Сначала доставал бы дерево, потом адреса всех извлечённых узлов.

Пихать всё в один запрос чревато: во-первых он сложный и его будет трудно читать, во-вторых каждый JOIN, да ещё через связи, множит количество обрабатываемых БД данных, которые потом просто отбрасываются.

Либо, если очень хочется SQL-решения, можно использовать зависимый подзапрос:
SELECT
	t.page_id,
	p.ancestor_id AS parent_id,
	(
		SELECT GROUP_CONCAT(u.ancestor_id ORDER BY u.distance DESC SEPARATOR '/')
		FROM tree AS u
		WHERE 1
			AND u.page_id = t.page_id
			AND u.ancestor_id > 0
	) AS url
FROM tree AS t
JOIN tree AS p ON (p.page_id = t.page_id AND p.distance = 1)
WHERE t.ancestor_id = @node
ORDER BY p.ancestor_id
Однако, смысла в подобном мало, так как дерево строится рекурсивно.
И если данные всегда извлекаются от корня (либо если известна часть пути до узла, выступающего в качестве корня), то достаточно извлечь сегмент адреса каждого узла и при выводе построить полный URL из сегментов.