SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 05.10.2009 19:13:39

Артем125
Участник
Зарегистрирован: 05.10.2009
Сообщений: 9

Запрос для дерева

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

Подскажите с запросом, есть таблица

Код:

CREATE TABLE category(
category_id INT AUTO_INCREMENT PRIMARY KEY,
category_name VARCHAR(20) NOT NULL,
category_parent INT DEFAULT NULL);

INSERT INTO category
VALUES(1,'ELECTRONICS',      

родитель каталога(число), назовем $page_id

),(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);

Необходимо выстроить путь от  ELECTRONICS до ( это значение переменно, может быть и LCD, и PLASMA и т.д)

Выстроить путь - это получить значения ELECTRONICS -> TELEVISIONS -> PLASMA

Допустим нам известно PLASMA, и $page_id. Неизвестен TELEVISIONS, его и надо получить
Узел TELEVISIONS является первым в иерархии, поскольку его родитель $page_id

Ухх

Не работает ((

Код:

$query = "CREATE PROCEDURE GET_PARENTS (category_id INTEGER)
        RETURNS (E_ID INTEGER, category_name CHAR(200))
        AS
        declare variable P_ID integer;
        BEGIN
          select category_parent from ".TABLE_CATEGORY." where category_id = :category_id into :category_id;
          WHILE (category_id > 0) DO
            BEGIN
              SELECT C.category_id, C.category_parent, C.category_name
              FROM ".TABLE_CATEGORY." C
              WHERE category_id = :category_id
              INTO :E_ID, :P_ID,:category_name;
              category_id=P_ID;
              SUSPEND;
            END
        END ^
        ";

Код после сборки такой

Код:

CREATE PROCEDURE GET_PARENTS (category_id INTEGER) 
RETURNS (E_ID INTEGER, category_name CHAR(200)) 
AS 
declare variable P_ID integer;
 BEGIN 
  select category_parent from category where category_id = :category_id into :category_id; 
   WHILE (category_id > 0) DO 
        BEGIN 
           SELECT C.category_id, C.category_parent, C.category_name 
           FROM category C 
           WHERE category_id = :category_id 
           INTO :E_ID, :P_ID,:category_name; 
           category_id=P_ID; 
           SUSPEND; 
         END
    END ^

Отредактированно Артем125 (05.10.2009 19:14:25)

Неактивен

 

#2 05.10.2009 20:08:18

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Запрос для дерева

SELECT category_parent FROM category WHERE category_id = 5.

Но, думаю, Вы ищете таки не непосредственного родителя, а всех.

Попробуйте сделать через временные таблички — код процедуры нормальный,
но выбирать лучше не в переменные, а в строки временной таблицы:

CREATE TEMPORARY TABLE get_parent_temp (id INT);
...
INSERT INTO get_parent_temp SELECT category_parent FROM category WHERE category_id = P_ID;
...
SELECT c.* FROM category c JOIN get_parent_temp p ON (c.category_id = p.id);
DROP TEMPORARY TABLE get_parent_temp

Неактивен

 

#3 05.10.2009 20:23:00

Артем125
Участник
Зарегистрирован: 05.10.2009
Сообщений: 9

Re: Запрос для дерева

paulus написал:

SELECT category_parent FROM category WHERE category_id = 5.
Но, думаю, Вы ищете таки не непосредственного родителя, а всех.

Спасибо что откликнулись, я ищу непосредственного родителя этого узла, или ветку для данного узла...

Известен какой-нибудь узел, например PLASMA, известен и родитель узла ELECTRONICS, сам ELECTRONICS не известен и этих узлов много. Необходимо в обратном порядке от PLASMA, найти TELEVISIONS и ELECTRONICS

ELECTRONICS
        TELEVISIONS
              PLASMA

Отредактированно Артем125 (05.10.2009 20:38:04)

Неактивен

 

#4 05.10.2009 20:39:51

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Запрос для дерева

Дада, верхнее находит непосредственного родителя, нижнее — всех smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson