Создайте всплывающее меню с родительскими элементами

Я планирую создать многопользовательский снимок или элемент выбора флажка в php. Но с родительским элементом элемента товара отношение корабль.

Например: у меня есть три отдельные таблицы tbl_branch, tbl_area, tbl_region и еще две таблицы для отображения tbl_regiontoarea и tbl_areatobranch. Теперь мне нужен флажок multi select или multi, который выглядит примерно так:

Branch 1 Area 1 Region 1 Region 2 Area 2 Region 3 Region 4 Region 7 Region 9 Area 5 Area 7 Region 8 Branch 2 Area 3 Branch 3 Branch 4 Branch 5 Area 6 Region 10 Area 2 

Так как вы бы это догадались, Branch – самая большая вершина иерархии, а регион – самый нижний, т. Е. Branch является родителем. Я бы хотел, чтобы он зациклился, пока он не найдет для него детей. Когда он перестанет находить детей, он перейдет к следующему родительскому элементу в массиве.

Я очень плохо разбираюсь в массивах и формирую сложные sql-запросы и, следовательно, с нетерпением ожидаю начального направления, как это сделать. Я был бы очень признателен, если бы кто-то мог помочь мне с тем же.

заранее спасибо

Я предлагаю вам прочитать это

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

Я установил дерево почти идентичных данных, и использование методов, предложенных в вышеупомянутом документе, значительно упростит проблему, особенно когда речь идет об определении родителей и братьев и сестер до n уровней.

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

Вот потенциальный план для вашей главной таблицы

 treeTable ( // ID field id INT UNSIGNED PK AI, // Fields for branching lft INT UNSIGNED, rgt INT UNSIGNED, // ID fields for the specific types leafType ENUM('Branch','Area','Region'), leafID INT UNSIGNED, leafName VARCHAR ) UNIQUE INDEX (leafType,leafID) 

Если вам нужны конкретные данные для каждого типа, вы можете создать для них отдельные таблицы, но приведенное выше позволит вам создать свое дерево, наметить идентификаторы и разрешить сохранение отношений вместе с отображаемым именем.

Конечно, чем больше данных вы можете нормализовать между каждым типом leafType, тем лучше, в идеале все они будут фактически одинаковыми типами данных, поскольку все они являются географическим подразделением

Пример примера ваших данных

 Branch 3 Branch 4 Branch 5 Area 6 Region 10 Area 2 

вы можете получить таблицу, такую ​​как

 id lft rgt leafType leafID 1 1 2 'Branch' 3 2 3 4 'Branch' 4 3 5 12 'Branch' 5 4 6 9 'Area' 6 5 7 8 'Region' 10 6 10 11 'Area' 2 

Запросы о вставке и т. Д. Можно найти в связанной статье, т. Е. (Цитируется дословно из http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ )

 LOCK TABLE nested_category WRITE; SELECT @myLeft := lft FROM nested_category WHERE name = '2 WAY RADIOS'; UPDATE nested_category SET rgt = rgt + 2 WHERE rgt > @myLeft; UPDATE nested_category SET lft = lft + 2 WHERE lft > @myLeft; INSERT INTO nested_category(name, lft, rgt) VALUES('FRS', @myLeft + 1, @myLeft + 2); UNLOCK TABLES; 

И тогда SELECT может проиллюстрировать дерево (опять же verbatim от источника)

 SELECT CONCAT( REPEAT( ' ', (COUNT(parent.name) - 1) ), node.name) AS name FROM nested_category AS node, nested_category AS parent WHERE node.lft BETWEEN parent.lft AND parent.rgt GROUP BY node.name ORDER BY node.lft; 

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

Следуя моему последнему комментарию, ниже приведено определение моей хранимой процедуры, которую я использую для вставки новых строк

 CREATE PROCEDURE `addOptionalExtraToTree`(inParentOptionID INT,inOptionName VARCHAR(40),inLeafType VARCHAR(20)) BEGIN DECLARE myRight INT UNSIGNED DEFAULT 0; SELECT optionalExtra_tree_right-1 INTO myRight FROM optionalExtras WHERE optionalExtraID = inParentOptionID; IF myRight = 0 THEN SELECT COALESCE(MAX(optionalExtra_tree_right),0) INTO myRight FROM optionalExtras; END IF; UPDATE optionalExtras SET optionalExtra_tree_right = optionalExtra_tree_right + 2 WHERE optionalExtra_tree_right > myRight; UPDATE optionalExtras SET optionalExtra_tree_left = optionalExtra_tree_left + 2 WHERE optionalExtra_tree_left > myRight; INSERT INTO optionalExtras ( optionalExtra_name, optionalExtra_leaf_type, optionalExtra_tree_left, optionalExtra_tree_right ) VALUES ( inOptionName, inLeafType, myRight + 1, myRight + 2 ); SELECT LAST_INSERT_ID() AS optionalExtraID; END; 

Затем это вызывается с использованием таких вызовов, как следующие

 CALL addOptionalExtraToTree(0,'New root option','Region'); CALL addOptionalExtraToTree(4,'New child option','Area');