Обход дерева SQL - PullRequest
       21

Обход дерева SQL

3 голосов
/ 27 сентября 2010

Я не совсем уверен, что назвал это правильно, но, пожалуйста, потерпите меня.

Мне интересно, возможно ли сделать что-то подобное в SQL (в частности, MySQL): допустим, у нас естькак данные, которые хранятся в базе данных в следующей таблице:

  mysql> desc data_table;
  +------------------------+---------------------+------+-----+---------+----------------+
  | Field                  | Type                | Null | Key | Default | Extra          |
  +------------------------+---------------------+------+-----+---------+----------------+
  | id                     | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
  | parent_id              | int(10) unsigned    | YES  | MUL | NULL    |                |
  | value                  | text                | YES  |     | NULL    |                |

Таким образом, у каждой строки есть родительский элемент, за исключением строки «root», а у каждой строки есть дочерние элементы, кроме строк листа.1007 * Можно ли найти всех потомков любой строки, использующей только SQL?

Ответы [ 3 ]

8 голосов
/ 27 сентября 2010

Можно выбрать всех потомков, использующих только SQL, но не в одном запросе. Но я уверен, что вы поняли это; Я предполагаю, что вы имеете в виду, что вы хотите сделать это в одном запросе.

Возможно, вас заинтересует чтение некоторых альтернативных конструкций для хранения древовидных структур, которые позволяют извлекать всех потомков с помощью одного SQL-запроса. Смотрите мою презентацию Модели для иерархических данных с SQL и PHP .

Вы также можете использовать рекурсивные запросы SQL с базами данных других марок (например, PostgreSQL), но MySQL в настоящее время не поддерживает эту функцию.

0 голосов
/ 25 июня 2014

Я просто задавал себе тот же вопрос.Это то, что я погуглил: http://moinne.com/blog/ronald/mysql/manage-hierarchical-data-with-mysql-stored-procedures

Он работает с хранимыми процедурами.

Но, по моему мнению, такая большая логика в БД не очень хорошая вещь.

0 голосов
/ 04 октября 2010

Возможно, вам лучше использовать модель с вложенным множеством (см. http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ - ниже). Это гораздо более эффективно для выбора, и вы можете получить полный путь к каждому узлу с помощью простого самостоятельного соединения. Однако на практике рекомендуется предварительно кэшировать путь и глубину, если вы хотите сделать что-то вроде «где глубина = 3» или хотите показать полный путь для нескольких узлов, если в вашей таблице более 1000 записей.

...