Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: рекурсивный спуск
 
 автор: ДобрыйУхх   (14.06.2010 в 18:05)   письмо автору
 
 

Здравствуйте!

есть табличка

CREATE TABLE IF NOT EXISTS `system_catalog` (
  `id_catalog` int(11) NOT NULL AUTO_INCREMENT,
  `name` tinytext NOT NULL,
  `id_parent` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id_catalog`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251;


и дамп

INSERT INTO `system_catalog` (`id_catalog`, `name`, `id_parent`) VALUES
(1, 'RO', 0),
(2, 'T', 0),
(3, 'Пораздел ',  1),
(4, 'О', 0),
(5, 'подкаталог', 4),
(7, 'Подраздел 2', 1),
(8, 'Подкаталог Подкталог ', 3);


Какой составить запрос, что бы введя id_catalog = 3 получить значение начальной ветви id_catalog=1

то есть нужно выводить все пока id parent не станет равным нулю
скажем для id=8 получиться 'Подкаталог Подкталог' 'Пораздел ' 'RO'

Отредактированно Артем125 (Сегодня 13:30:16)

  Ответить  
 
 автор: Trianon   (15.06.2010 в 00:39)   письмо автору
 
   для: ДобрыйУхх   (14.06.2010 в 18:05)
 

Метод рекурсивного спуска или нисходящий разбор — это один из методов определения принадлежности входной строки к некоторому формальному языку, описанному LL(k) контекстно-свободной грамматикой.

(с) Wiki

  Ответить  
 
 автор: вред   (15.06.2010 в 09:56)
 
   для: ДобрыйУхх   (14.06.2010 в 18:05)
 

DELIMITER $$

DROP PROCEDURE IF EXISTS `test`.`selectSelfAndParents` $$
CREATE PROCEDURE `test`.`selectSelfAndParents` (IN id INT)
BEGIN
  DECLARE _id_catalog INT;
  DECLARE _name TINYTEXT;
  DECLARE _id_parent INT DEFAULT id;

  DROP TABLE IF EXISTS result;
  CREATE TEMPORARY TABLE  `result` (
  `id_catalog` int(11) NOT NULL,
  `name` tinytext NOT NULL,
  `id_parent` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id_catalog`)
 ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

  iterator: REPEAT
    SELECT id_catalog, name, id_parent
      FROM system_catalog
      WHERE id_catalog=_id_parent
      LIMIT 1
      INTO _id_catalog, _name, _id_parent;
    IF _id_catalog IS NULL THEN
      LEAVE iterator;
    END IF;
    INSERT INTO result VALUES (_id_catalog, _name, _id_parent);
  UNTIL _id_parent=0 END REPEAT;

  SELECT * FROM result;

END $$

DELIMITER ;


CALL selectSelfAndParents(8)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования