powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / продолжаем мучать шоп :) запрос
6 сообщений из 6, страница 1 из 1
продолжаем мучать шоп :) запрос
    #33911001
twistfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привте всем.
Сложилась ситуация
используется postgreSQL бд - в ней 2 таблицы
shop_cats (
id SERIAL PRIMARY KEY,
parent_id int4,
...
);
shop_goods (
id SERIAL PRIMARY KEY,
cat_id int4, //идентификатор группыв таблице shop_cats
)

ТО есть есть структура дерева (категории)

Например - товар имеет cat_id=5
а в таблице shop_cats такая ситуация:
id | parent_id | nazvanie
1 | 0 | knigi
2 | 0 | diski
3 | 0 | fonari
4 | 1 | hudejestvennie
5 | 4 | S. King

то есть в итоге получаю
Knigi -> hudojestvennie->S.King
так вот вопрос:
как мне в итоге выбрать 5 последних (по id) товаров у окторых самая главная категория например 1?
...
Рейтинг: 0 / 0
продолжаем мучать шоп :) запрос
    #33913373
victor_kr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вариант 1:

Написать рекурсивную функция, которая возвращает идентификаторы всех подкатегорий категории 1. Результат работы функции при-join-ить к стравочнику товаров и в полученном запросе дописать limit 5.

Вариант 2:

Вместо рекурсивной функции использовать подход описанный здесь
http://www.rsdn.ru/article/db/db_nav1.xml
...
Рейтинг: 0 / 0
продолжаем мучать шоп :) запрос
    #33914806
DeWiL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вариант 3

lib: ltree
...
Рейтинг: 0 / 0
продолжаем мучать шоп :) запрос
    #33923921
twistfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
помогите написать рекурсивную функцию :)
а то что-то никак понять не могу...

CREATE FUNCTION getmothid(int4,int4) RETURNS int4 AS
'
DECLARE
current_cat ALIAS FOR $1;
current_parent ALIAS FOR $2;
BEGIN
WHILE current_parent<>0 LOOP
SELECT cat_id,parent_id FROM shop_cats WHERE parent_id=current_parent;
???
что должно быть здесь
END LOOP;
RETURN current_cat;
END;
'LANGUAGE 'plpgsql';

идея в том, чтобы для определенной категории выдавать номер главной материнской (у главной материнской категории всегда parent_id=0)
...
Рейтинг: 0 / 0
продолжаем мучать шоп :) запрос
    #33924023
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел в реально работающей программе. Цикл без рекурсии. Возвращает всех предков.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create or replace function caid_prids(integer) returns setof integer as '
DECLARE
  mycaid integer;
BEGIN
  mycaid := $1;
  LOOP
    RETURN NEXT mycaid;
    SELECT INTO mycaid prid from pr_categs where caid = mycaid;
    IF mycaid = 0 OR NOT FOUND THEN
       EXIT;
    END IF;
  END LOOP;
  RETURN;
END;
' LANGUAGE 'plpgsql';
Если нужно возвращать только главного предка, то примерно так. Не проверял.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create or replace function caid_main_prid(integer) returns integer as '
DECLARE
  mycaid,prcaid integer;
BEGIN
  mycaid := $1;
  LOOP
    SELECT INTO prcaid prid from pr_categs where caid = mycaid;
    IF prcaid = 0 OR NOT FOUND THEN
       RETURN mycaid;
    END IF;
    mycaid := prcaid;
  END LOOP;
  RETURN;
END;
' LANGUAGE 'plpgsql';
Или можно приждоинить caid_prids() as caid к pr_categs и отфильтровать по условию prid=0.

PS в таблице pr_categs поля caid (category_id) и prid (parent_id)
...
Рейтинг: 0 / 0
продолжаем мучать шоп :) запрос
    #33926073
twistfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо.
немного переписал - но работает :)
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / продолжаем мучать шоп :) запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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