powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Выборка по родительским элементам
8 сообщений из 8, страница 1 из 1
Выборка по родительским элементам
    #34188341
twistfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток всем!
Опять играюсь со своим деревом в бд...
существуют таблицы
shop_cats (
id integer NOT NULL nextval('shop_cats_id_seq'::regclass)
parent_id integer
...
);
Где parent_id - идентификатор родительского элемента (Главной категории), т.е. например
Комплектующие->Процессоры->Intel->Socket 775

И другая таблица:
shop_goods (
id integer NOT NULL nextval('shop_goods_id_seq'::regclass)
cat_id integer
...
);

т.е. например товары такие есть
id=1, cat_id=64, good_name=Intel Core 2 DUO...
id=2, cat_id=66, good_name=AMD 64FX...

Для первого путь категорий строится так:
Комплектующие->Процессоры->Intel->Socket 775
для второго
Комплектующие->Процессоры->AMD->Socket 939

Как получить список всех товаров, которые входят в категорию Процессоры??

То есть нет ни одного товара с cat_id=.. (категории процессоры), они все в своих подкатеогриях...
А нужно вытащить именно список товаров...

Короче в функцию можно передать только параметры: номер текущей категории (для которой нужно вывести список товаров), число подкатегорий... и лимит - сколько выбирать из этого всего списка..
И все...
не знаю как это сделать - наведите на мысль, будьте добры.
...
Рейтинг: 0 / 0
Выборка по родительским элементам
    #34188661
DeWiL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
боюсь без рекурсивного обхода тебе не обойтись при таком построении дерева.
соответсвенно скорости на таких поисках не получишь.

советую посмотреть на ltree библиотеку.
...
Рейтинг: 0 / 0
Выборка по родительским элементам
    #34188801
twistfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да тут скорость не так и важна...
тут записей - всего тісяч 30...
и категорий всего 500...
...
Рейтинг: 0 / 0
Выборка по родительским элементам
    #34205380
twistfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то никак не могу разобраться...
нужно всего лишь вытащить все id товаров, которые могут принадлежать подкатегориям данной категории..
Вроде все так просто, а реализовать не могу..
...
Рейтинг: 0 / 0
Выборка по родительским элементам
    #34206586
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
create table shop_cats (
id integer not null,
parent_id integer
);

create table shop_goods (
id serial,
cat_id integer
);

create function g ( integer ) returns setof shop_goods as '
DECLARE
  myid integer;
  good shop_goods;
  child shop_cats;
BEGIN
  myid := $1;
  FOR good IN select * from shop_goods where cat_id = myid order by id LOOP
    RETURN NEXT good;
  END LOOP;
  FOR child IN select * from shop_cats where parent_id = myid order by id LOOP
    FOR good IN select * from g ( child.id ) LOOP
      RETURN NEXT good;
    END LOOP;
  END LOOP;
  RETURN;
  RETURN;
END;
' LANGUAGE 'plpgsql';
шлите пиво на мыло :)
...
Рейтинг: 0 / 0
Выборка по родительским элементам
    #34209048
twistfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СПАСИБОООО!!!

а как сделать, чтобы ф-ия возвращала не записи в виде "таблицы" shop_goods, а только id товаров в shop_goods??
То есть как я понимаю, мне не нужно returns setof shop_goods, а нужно что-то другое...

А то я попытался переделать, а оно мне все-равно возвращает как-бы таблицу, где только одно значение есть (id), а все остальные - пустые.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
create function g ( integer ) returns setof shop_goods as '
DECLARE
  myid integer;
  good shop_goods;
  child shop_cats;
BEGIN
  myid := $1;
  FOR good IN select id from shop_goods where cat_id = myid order by id DESC LOOP
    RETURN NEXT good;
  END LOOP;
  FOR child IN select id from shop_cats where parent_id = myid order by id LOOP
    FOR good IN select id from g ( child.id ) LOOP
      RETURN NEXT good;
    END LOOP;
  END LOOP;
  RETURN;
  RETURN;
END;
' LANGUAGE 'plpgsql';
...
Рейтинг: 0 / 0
Выборка по родительским элементам
    #34209190
Бабичев Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Автор:
Может тебе посмотреть в сторону иерархических запросов???
Тынц , если что...
...
Рейтинг: 0 / 0
Выборка по родительским элементам
    #34209483
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
twistfireа как сделать, чтобы ф-ия возвращала не записи в виде "таблицы" shop_goods, а только id товаров в shop_goods?? То есть как я понимаю, мне не нужно returns setof shop_goods, а нужно что-то другое...setof integer?

читать доку по функциям и plpgsql

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create function g2 ( integer ) returns setof integer as '
DECLARE
  myid integer;
  good shop_goods;
  child shop_cats;
BEGIN
  myid := $1;
  FOR good IN select * from shop_goods where cat_id = myid order by id LOOP
    RETURN NEXT good.id;
  END LOOP;
  FOR child IN select * from shop_cats where parent_id = myid order by id LOOP
    FOR good IN select * from g ( child.id ) LOOP
      RETURN NEXT good.id;
    END LOOP;
  END LOOP;
  RETURN;
END;
' LANGUAGE 'plpgsql';
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Выборка по родительским элементам
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]