Я потратил последние несколько часов, пытаясь найти решение этого вопроса онлайн. Я нашел множество примеров того, как преобразовать вложенный набор в смежность ... но немногие идут наоборот. Примеры, которые я нашел, либо не работают, либо используют процедуры 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
Вот изображение того, что мне нужно:
У меня есть функция, основанная на псевдокоде из этого сообщения на форуме ( 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
Вот изображение того, что мне нужно:
У меня есть функция, основанная на псевдокоде из этого сообщения на форуме ( http://www.sitepoint.com/forums/showthread.php?t=320444 ), но она не работает . Я получаю несколько строк с одинаковым значением left. Этого не должно происходить.
\n"; throw new Exception(mysql_error()); } echo "$s_query
$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
Вот изображение того, что мне нужно:
У меня есть функция, основанная на псевдокоде из этого сообщения на форуме ( http://www.sitepoint.com/forums/showthread.php?t=320444 ), но она не работает . Я получаю несколько строк с одинаковым значением left. Этого не должно происходить.
\n"; throw new Exception(mysql_error()); } echo "$s_query
$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. Этого не должно происходить.\n"; throw new Exception(mysql_error()); } echo "$s_query
$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. Этого не должно происходить.\n"; throw new Exception(mysql_error()); } echo "$s_query
$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 и право должно быть уникальным. Вот пример того, как вручную пронумеровать левый и правый идентификаторы во вложенном наборе:
Изображение предоставлено: Gijs Van Tulder, ссылка на статью