Подсчитать все дочерние узлы в иерархической (древовидной) структуре данных в MySQL, используя PHP - PullRequest
0 голосов
/ 22 марта 2020

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

Итак, допустим, у нас есть эта таблица:

NodeID |  ParentID
-------------------
  1    |     0
  2    |     1
  3    |     1
  4    |     2
  5    |     1
  6    |     2
  7    |     3
  8    |     5
  9    |     6
 10    |     8
 11    |     6
 11    |     6
• 1
  • 2
    • 4
    • 6
      • 9
      • 11
      • 12
  • 3
    • 7
  • 5
    • 8
      • 10

Итак, если я хочу чтобы получить число детей узла 1, число должно быть 11 вместо 3. То же самое для узла 2. Число должно быть 5 вместо 2.

Это рекурсивная функция, которую я создал в PHP, но это МЕДЛЕННО:

function count_all_nodes($connection, $element_id, $elements=false, $i=0) {
    if (!$elements) {
        $result = mysqli($connection, "SELECT `node_id`, `parent_id` FROM `elements`");

        while ($row = mysqli_fetch_array($result)) {
            $sub_elements["node_id"] = $row["node_id"];
            $sub_elements["parent_id"] = $row["parent_id"];
            $elements[] = $sub_elements;
        }
    }

    foreach ($elements as $element) {
        if ($element["parent_id"] == $element_id) {
            $i++;
            $i += count_all_nodes($connection, $element_id, $elements);
        }
    }

    return $i;
}

Можно ли как-нибудь избежать этой рекурсивной функции?

Спасибо!

...