|
|
|
| Здравствуйте!
есть табличка
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) | |
|
|
|
|
|
|
|
для: ДобрыйУхх
(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)
|
| |
|
|
|