У меня есть решение для учетных записей GSuite, у которого нет суффикса "@ gmail.com". Также я думаю, что это будет работать для учетных записей GSuite с @ gmail.com, но еще не пробовал. Во-первых, у вас должны быть права изменить опцию «allos¿w менее безопасное приложение» для вашей учетной записи GSuite. Если у вас есть права (вы можете проверить их в настройках учетной записи -> безопасность), вам придется отключить «двухэтапную аутентификацию», перейти в конец страницы и установить «да», чтобы разрешить менее безопасные приложения. Это все. Если у вас нет прав для изменения этих параметров, решение для этого потока не будет работать. Установите флажок https://support.google.com/a/answer/6260879?hl=ru , чтобы внести изменения в параметр «разрешить меньше ...».
Первый ключ - отсортировать результаты SQL по количеству предков. Я сделал это в PHP, так как я избегаю сложностей с многозначными числами.
Это предоставляет список узлов в том порядке, в котором они могут быть правильно вставлены.
Array
(
[1] => Array
(
[0] => 1
)
[4] => Array
(
[0] => 4
[1] => 1
)
[2] => Array
(
[0] => 2
[1] => 1
)
[3] => Array
(
[0] => 3
[1] => 1
[2] => 2
)
)
На данный момент меня не волнует ключи, только списки предков. Путь по дереву можно найти между пересечением доступных узлов и оставшихся предков.
function add_node($ancestors, &$tree) {
if (count($ancestors) == 1) {
$tree[array_pop($ancestors)] = array();
return;
}
$next_node = array_intersect($ancestors, array_keys($tree));
$this->add_node(
array_diff($ancestors, $next_node) ,
$tree[array_pop($next_node)]
);
}
Я использовал закрывающую таблицу (этот термин звучит для меня странно ... Я забыл, как / где я слышал, что он вызвал что-то еще), но у меня был третий столбец " расстояние" между предком и потомком, что позволяет вам различать прямых потомков (потомков) и косвенных потомков (внуков и т. д.).
Технически перечисленная вами таблица может записывать данные в ориентированном ациклическом графе, поэтому может быть невозможно построить иерархический дерево без повторяющихся разделов.
edit:
Если бы я выполнял запросы в PHP, я бы, вероятно, просто SELECT в самой таблице без использования GROUP_CONCAT - вы все равно будете обрабатывать вещи процедурно, так почему бы просто не получить соответствующее подмножество закрывающей таблицы в ее самой сырой форме?
Обратите внимание, что закрывающая таблица не будет хранить информацию о порядке (если это важно).
Если древовидные аспекты этих иерархических данных очень важны, и у вас есть выбор, как хранить данные,