загрузка всего связанного списка в одном запросе Ruby / MySQL - PullRequest
2 голосов
/ 27 января 2010

Я храню связанные списки данных в записях, которые выглядят так:

CREATE TABLE IF NOT EXISTS `data_nodes` (
  `record_id` int(11) NOT NULL,
  `prev_node` int(11) NOT NULL,
  `data` varchar(200) NOT NULL,
  PRIMARY KEY  (`record_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

где prev_node - это идентификатор_записи предыдущего элемента в списке или 0, если мы находимся на первом элементе в списке.

Типичный список может выглядеть примерно так:

record_id     prev_node     data
---------     ---------     ----
1             0             first item
12            1             second item
27            12            third item

Я использую модуль MySQL в Ruby, и я хотел бы сделать следующее: учитывая номер записи последнего элемента в списке, загрузить весь список в одном запросе. (например, с учетом идентификатора записи 27, вернуть набор результатов, который содержит «первый элемент», «второй элемент», «третий элемент»)

Можно ли это сделать?

Спасибо.

Ответы [ 3 ]

1 голос
/ 27 января 2010

Это возможно для дерева любой фиксированной высоты N, но вы не сможете выполнить эту операцию, если высота дерева станет N + 1.

Другими словами, если вы знаете, сколько уровней родительских / дочерних узлов, вы можете построить запрос, как описано здесь (поиск Retrieving a Single Path): http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

Вы можете использовать модель вложенного набора и плагин RoR acts_as_nested_set для получения желаемых результатов.

Если вам нужна помощь по статье, дайте знать.

0 голосов
/ 27 января 2010

Вам потребуется рекурсивный запрос SQL, например, НАЧАТЬ С ... ПОДКЛЮЧИТЬ ПО В Oracle. К сожалению, MySQL не поддерживает такую ​​конструкцию в одном запросе. Хранимые функции также не могут выполнять рекурсию.

0 голосов
/ 27 января 2010

Похоже, это потребует рекурсии. Я не знаю, реализует ли MySQL рекурсию в SQL, и если да, то она, вероятно, не будет очень производительной. Я не уверен, что хранение таких данных - лучшее решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...