Как преобразовать родительско-дочернюю таблицу (смежность) во вложенный набор с помощью PHP и MySQL?

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

У меня есть таблица, в которой используется модель смежности, приведенная ниже:

id          parent_id         category
1           0                 Books
2           0                 CD's
3           0                 Magazines
4           1                 Books/Hardcover
5           1                 Books/Large Format
6           3                 Magazines/Vintage

И я хотел бы преобразовать ее в таблицу вложенных наборов ниже:

id    left    right          category
0     1       14             Root Node
1     2       7              Books
4     3       4              Books/Hardcover
5     5       6              Books/Large Format
2     8       9              CD's
3     10      13             Magazines
6     11      12             Magazines/Vintage

Вот изображение того, что мне нужно:

Nested Tree Chart

У меня есть функция, основанная на псевдокоде из этого сообщения на форуме ( http://www.sitepoint.com/forums/showthread.php?t=320444 ), но она не работает . Я получаю несколько строк с одинаковым значением left. Этого не должно происходить.

$s_query
\n"; throw new Exception(mysql_error()); } echo "

$s_query

\n"; // get the newly created row id $i_new_nested_id = mysql_insert_id(); } return $i_right + 1; } /** * get_source_children * * Examines the "adjacent" table and finds all the immediate children of a node * @param integer $i_id The unique id for a node in the adjacent_table table * @return array Returns an array of results or an empty array if no results. */ function get_source_children($i_id) { $a_return = array(); $s_query = "SELECT * FROM `adjacent_table` WHERE `father_id` = '".$i_id."'"; if (!$i_result = mysql_query($s_query)) { echo "
$s_query
\n"; throw new Exception(mysql_error()); } if (mysql_num_rows($i_result) > 0) { while($a = mysql_fetch_assoc($i_result)) { $a_return[] = $a; } } return $a_return; } ?>

Это результат выполнения приведенного выше сценария.

INSERT INTO nested_table ( id , t использовать процедуры для этого проекта. Мне нужно чистое решение PHP.

У меня есть таблица, в которой используется модель смежности, приведенная ниже:

id          parent_id         category
1           0                 Books
2           0                 CD's
3           0                 Magazines
4           1                 Books/Hardcover
5           1                 Books/Large Format
6           3                 Magazines/Vintage

И я хотел бы преобразовать ее в таблицу вложенных наборов ниже:

id    left    right          category
0     1       14             Root Node
1     2       7              Books
4     3       4              Books/Hardcover
5     5       6              Books/Large Format
2     8       9              CD's
3     10      13             Magazines
6     11      12             Magazines/Vintage

Вот изображение того, что мне нужно:

Nested Tree Chart

У меня есть функция, основанная на псевдокоде из этого сообщения на форуме ( http://www.sitepoint.com/forums/showthread.php?t=320444 ), но она не работает . Я получаю несколько строк с одинаковым значением left. Этого не должно происходить.

$s_query
\n"; throw new Exception(mysql_error()); } echo "

$s_query

\n"; // get the newly created row id $i_new_nested_id = mysql_insert_id(); } return $i_right + 1; } /** * get_source_children * * Examines the "adjacent" table and finds all the immediate children of a node * @param integer $i_id The unique id for a node in the adjacent_table table * @return array Returns an array of results or an empty array if no results. */ function get_source_children($i_id) { $a_return = array(); $s_query = "SELECT * FROM `adjacent_table` WHERE `father_id` = '".$i_id."'"; if (!$i_result = mysql_query($s_query)) { echo "
$s_query
\n"; throw new Exception(mysql_error()); } if (mysql_num_rows($i_result) > 0) { while($a = mysql_fetch_assoc($i_result)) { $a_return[] = $a; } } return $a_return; } ?>

Это результат выполнения приведенного выше сценария.

INSERT INTO nested_table ( id , t использовать процедуры для этого проекта. Мне нужно чистое решение PHP.

У меня есть таблица, в которой используется модель смежности, приведенная ниже:

id          parent_id         category
1           0                 Books
2           0                 CD's
3           0                 Magazines
4           1                 Books/Hardcover
5           1                 Books/Large Format
6           3                 Magazines/Vintage

И я хотел бы преобразовать ее в таблицу вложенных наборов, представленную ниже:

id    left    right          category
0     1       14             Root Node
1     2       7              Books
4     3       4              Books/Hardcover
5     5       6              Books/Large Format
2     8       9              CD's
3     10      13             Magazines
6     11      12             Magazines/Vintage

Вот изображение того, что мне нужно:

Nested Tree Chart

У меня есть функция, основанная на псевдокоде из этого сообщения на форуме ( http://www.sitepoint.com/forums/showthread.php?t=320444 ), но она не работает . Я получаю несколько строк с одинаковым значением left. Этого не должно происходить.

$s_query
\n"; throw new Exception(mysql_error()); } echo "

$s_query

\n"; // get the newly created row id $i_new_nested_id = mysql_insert_id(); } return $i_right + 1; } /** * get_source_children * * Examines the "adjacent" table and finds all the immediate children of a node * @param integer $i_id The unique id for a node in the adjacent_table table * @return array Returns an array of results or an empty array if no results. */ function get_source_children($i_id) { $a_return = array(); $s_query = "SELECT * FROM `adjacent_table` WHERE `father_id` = '".$i_id."'"; if (!$i_result = mysql_query($s_query)) { echo "
$s_query
\n"; throw new Exception(mysql_error()); } if (mysql_num_rows($i_result) > 0) { while($a = mysql_fetch_assoc($i_result)) { $a_return[] = $a; } } return $a_return; } ?>

Это результат выполнения приведенного выше сценария.

INSERT INTO nested_table ( id , на основе псевдокода из этого сообщения на форуме ( http://www.sitepoint.com/forums/showthread.php?t=320444 ), но он не работает. Я получаю несколько строк с одинаковым значением left. Этого не должно происходить.

$s_query
\n"; throw new Exception(mysql_error()); } echo "

$s_query

\n"; // get the newly created row id $i_new_nested_id = mysql_insert_id(); } return $i_right + 1; } /** * get_source_children * * Examines the "adjacent" table and finds all the immediate children of a node * @param integer $i_id The unique id for a node in the adjacent_table table * @return array Returns an array of results or an empty array if no results. */ function get_source_children($i_id) { $a_return = array(); $s_query = "SELECT * FROM `adjacent_table` WHERE `father_id` = '".$i_id."'"; if (!$i_result = mysql_query($s_query)) { echo "
$s_query
\n"; throw new Exception(mysql_error()); } if (mysql_num_rows($i_result) > 0) { while($a = mysql_fetch_assoc($i_result)) { $a_return[] = $a; } } return $a_return; } ?>

Это результат выполнения приведенного выше сценария.

INSERT INTO nested_table ( id , на основе псевдокода из этого сообщения на форуме ( http://www.sitepoint.com/forums/showthread.php?t=320444 ), но он не работает. Я получаю несколько строк с одинаковым значением left. Этого не должно происходить.

$s_query
\n"; throw new Exception(mysql_error()); } echo "

$s_query

\n"; // get the newly created row id $i_new_nested_id = mysql_insert_id(); } return $i_right + 1; } /** * get_source_children * * Examines the "adjacent" table and finds all the immediate children of a node * @param integer $i_id The unique id for a node in the adjacent_table table * @return array Returns an array of results or an empty array if no results. */ function get_source_children($i_id) { $a_return = array(); $s_query = "SELECT * FROM `adjacent_table` WHERE `father_id` = '".$i_id."'"; if (!$i_result = mysql_query($s_query)) { echo "
$s_query
\n"; throw new Exception(mysql_error()); } if (mysql_num_rows($i_result) > 0) { while($a = mysql_fetch_assoc($i_result)) { $a_return[] = $a; } } return $a_return; } ?>

Это результат выполнения приведенного выше сценария.

INSERT INTO nested_table ( id , lft , rgt , категория ) ЗНАЧЕНИЯ ( NULL, '2', '5', 'Hard Cover')

INSERT INTO nested_table ( id , lft , rgt , категория ) ЗНАЧЕНИЯ ( NULL, '2', '7', 'Large Format')

INSERT INTO nested_table ( id , lft , rgt , категория ) ЗНАЧЕНИЯ ( NULL, '1', '8', 'Books')

INSERT INTO nested_table ( id , lft , rgt , категория ) ЗНАЧЕНИЯ ( NULL, '1', '10', 'CD \' s ')

ВСТАВИТЬ В вложенную_таблицу ( id , lft , rgt , категория ) ЗНАЧЕНИЯ ( NULL, '10', '13', 'Vintage')

INSERT INTO nested_table ( id , lft , rgt , категория ) ЗНАЧЕНИЯ ( NULL, '1', '14', 'Magazines')

INSERT INTO nested_table ( id , lft , rgt , категория ) ЗНАЧЕНИЯ ( NULL, '0', '15', 'ROOT')

Как видите, существует несколько строк, разделяющих значение lft, равное «1», то же самое, что и «2». Во вложенном наборе значения для left и право должно быть уникальным. Вот пример того, как вручную пронумеровать левый и правый идентификаторы во вложенном наборе:

How to number nested sets

Изображение предоставлено: Gijs Van Tulder, ссылка на статью

21
задан 13 revs, 3 users 73% 1 July 2016 в 03:30
поделиться