Я переношу данные из одной схемы базы данных в другую. Старый схема имеет систему категоризации на основе списка смежности, с id, категория и parent_id. Если одна категория меньше второй, это категория имеет второй идентификатор в качестве родительского идентификатора. Например:
+-------------+----------------------+--------+
| category_id | name | parent |
+-------------+----------------------+--------+
| 1 | ELECTRONICS | NULL |
| 2 | TELEVISIONS | 1 |
| 3 | TUBE | 2 |
| 4 | LCD | 2 |
| 5 | PLASMA | 2 |
| 6 | PORTABLE ELECTRONICS | 1 |
| 7 | MP3 PLAYERS | 6 |
| 8 | FLASH | 7 |
| 9 | CD PLAYERS | 6 |
| 10 | 2 WAY RADIOS | 6 |
+-------------+----------------------+--------+
Новая схема имеет модифицированный алгоритм обхода дерева предварительного порядка:
+-------------+----------------------+-----+-----+
| category_id | name | lft | rgt |
+-------------+----------------------+-----+-----+
| 1 | ELECTRONICS | 1 | 20 |
| 2 | TELEVISIONS | 2 | 9 |
| 3 | TUBE | 3 | 4 |
| 4 | LCD | 5 | 6 |
| 5 | PLASMA | 7 | 8 |
| 6 | PORTABLE ELECTRONICS | 10 | 19 |
| 7 | MP3 PLAYERS | 11 | 14 |
| 8 | FLASH | 12 | 13 |
| 9 | CD PLAYERS | 15 | 16 |
| 10 | 2 WAY RADIOS | 17 | 18 |
+-------------+----------------------+-----+-----+
Примеры взяты из статьи Управление иерархическими данными в MySQL .
В любом случае, я могу написать php скрипт с рекурсивной функцией который перенесет список смежности в древовидную структуру предварительного заказа. Обычно для каждой строки он вставляет пустое значение 'rgt', выглядит для детей, применяет к ним функцию рекурсивно, отслеживая счетчика, а затем обновляет значение 'rgt'.
Но я хочу сделать это на чистом SQL. Однако я не знаю достаточно, чтобы понять закрепиться на нем. Для начала, я не знаю, сможете ли вы сделать это с помощью рекурсивный запрос, или если есть другие способы сделать это.