Остановить рекурсивные кровосмесительные дочерние родительские отношения в mysql

Я программирую на PHP/MySQL/Javascript. У меня есть список частей, которые мы хотим связать в дочерних/родительских отношениях без ограничения количества уровней.

Когда я выбираю из списка частей, чтобы добавить дочернюю часть к родителю, я ограничиваю список частей, чтобы исключить сам родитель и любые части, которые уже являются дочерними элементами этого родителя.

Что я обнаружил, так это то, что я также хочу исключить бабушку и дедушку родителя, поскольку в противном случае мы можем получить кровосмесительные отношения, которые при отображении дерева частей создадут бесконечный цикл.

Мало того, я не могу допустить, чтобы дочерняя часть была прадедом родителя или прапрадедом и т. д.

Вот оператор SQL, который я использую в настоящее время, и я думаю, что его также можно улучшить, используя LEFT JOIN, но я недостаточно хорошо разбираюсь в SQL на данный момент.

SELECT * 
FROM sch_part_general 
WHERE (sch_part_general.part_id <> $parentId) 
AND (sch_part_general.part_id NOT IN 
  (SELECT part_id FROM sch_part_mapping WHERE parent_id = $parentId)
)

sch _part _general — это таблица из нескольких столбцов со всеми частями, с идентификатором части _в качестве первичного ключа. sch _сопоставление части _представляет собой таблицу сопоставления двух столбцов с идентификатором части _(дочерний элемент )|| родитель _идентификатор (родитель ).

Может ли кто-нибудь указать мне правильное направление с запросом SQL? Я не заинтересован в использовании цикла while для создания оператора SQL, поскольку я думаю, что это будет довольно неэффективно, но это единственный способ, который, как я считал, может работать до сих пор.

10
задан James Pitt 25 July 2012 в 16:01
поделиться