parser

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

 

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

Ответ

Mizter Egoist 03.02.2016 17:30 / 03.02.2016 17:37

Почему ерунда?
Фрагменты дерева легко извлекать запросами на подобии:
#Выборка родителя и его детей
SELECT
	*
FROM
	pages p
JOIN
	path t ON (p.pID = t.dsc)
WHERE
	t.anc = $param
#Выборка ребенка и его родителей
SELECT
	*
FROM
	pages p
JOIN
	path t ON (p.pID = t.anc)
WHERE
	t.dsc = $param
Примерно понял как работает вывод дерева, хеш строится для того, чтобы сгруппировать всех предков в одного родителя, а в метод передается родитель для того, чтобы использовать его как ссылку, по которой будет происходить переход.
Т.е. метод берет заданный хеш, ищет в нем ключ = родитель, достает из хеша записи детей, если ребенок является родителем, то извлекаются его дети.

Единственная проблема у меня, это когда ключ = родителю = записи, происходит циклическая переадресация, получается, что метод ссылается на себя бесконечно, как это обойти не знаю.

Единственный понятный для меня выход, это поменять таблицу связей
CREATE TABLE IF NOT EXISTS `path` (
	`anc` INT NOT NULL,
	`dsc` INT NOT NULL,
	`lvl` INT NOT NULL,
	PRIMARY KEY(anc, dsc),
		FOREIGN KEY (anc)
			REFERENCES pages (pID),
		FOREIGN KEY (dsc)
			REFERENCES pages (pID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Минимум, это убрать FOREIGN KEY (anc) REFERENCES pages (pID)

А если таблицу не трогать, то выхода Я не вижу, поэтому и интересуюсь у Вас.

Например, делаю запрос к БД
SELECT
	p.*, 
	h.anc AS parent
FROM
	pages p
JOIN
	path h ON p.pID = h.dsc
LEFT JOIN
	path t ON (h.anc = t.anc AND t.lvl = 1)
Результат будет следующим:
pID	tID	uID	parent
97	1	7	97
107	1	7	107
117	1	7	97
127	1	7	117
137	1	7	127
147	1	7	127
147	1	7	137