Я программирую на 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, поскольку я думаю, что это будет довольно неэффективно, но это единственный способ, который, как я считал, может работать до сих пор.