Я программирую в PHP/MySQL/Javascript. У меня есть список частей, которые мы хотим связать в отношении child/parent без ограничения количества ярусов.
Когда я выбираю из списка частей, чтобы добавить ребенка к родительскому, я ограничиваю список частей, чтобы исключить сам родитель и любые части, которые уже являются дочерними элементами этого родителя.
Что я обнаружил, так это то, что я также хочу исключить бабушек и дедушек родителя, так как иначе мы можем получить кровосмесительные отношения, которые при отображении дерева частей создадут бесконечный цикл.
Не только это, но я не могу допустить, чтобы дочерняя часть была великим дедушкой или родителем родителя или великого прародителя e.t.c.
Вот оператор 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 - таблица с несколькими столбцами со всеми частями, а part_id - как первичный ключ. sch_part_mapping - таблица отображения двух столбцов с part_id (child) || parent_id (родительский).
Может ли кто-нибудь указать мне в правильном направлении с SQL-запросом? Я не заинтересован в том, чтобы использовать цикл while для создания SQL-оператора, поскольку я думаю, что это будет довольно неэффективно, но это единственный способ, который, как я считал, может работать до сих пор.