@DenisDangerous

Как исключить потомков из запроса?

Подскажите. Делаю программу заметки по категориям, нужно реализовать перемещение категории. Как при формировании списка категорий куда можно переместить исключить саму категорию, ее потомков и потомков потомков. Если с первыми двумя никаких проблем, то с последним проблемы...
  • Вопрос задан
  • 217 просмотров
Решения вопроса 1
@Noxy
увлекаюсь SQL
Понятно.
1. Погуглить построение дерева через JOIN (если число уровней ограниченное)
2. В SQLLite есть CTE - рекурсия => стандартное решение построения дерева.

Строите в запросе дерево с нужного узла, выбирая их ИД и далее исключаете их.

WHETE id NOT IN 
(
SELECT t2.id
FROM categories  AS t1
LEFT JOIN categories  AS t2 ON t2.parent_id = t1.id
WHERE t1.id = 1 ---- тут ваша категория переносимая
UNION 
SELECT t3.id
FROM categories  AS t1
LEFT JOIN categories  AS t2 ON t2.parent_id = t1.id
LEFT JOIN categories  AS t3 ON t3.parent_id = t2.id
WHERE t1.id = 1 ---- тут ваша категория переносимая
)


с рекурсией интересней:
WITH RECURSIVE CTE as (
	select 	Id, Name, parent_id, 0 as Level
	from categories
	where parent_id = @IdCategory  ---- тут ваша категория переносимая
	union all
	select 
	t2.Id, t2.Name, t2.parent_id, Level + 1
	from categories  t2
	join CTE on CTE.Id = t2.parent_id
 )
 SELECT * FROM categories
 WHERE Id NOT IN (SELECT Id FROM CTE )


за синтаксис не отвечаю, нет возможности проверить)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы