Как реализовать циклы в PostgreSQL - PullRequest
0 голосов
/ 07 октября 2018

У меня болит голова от реализации loop в моем запросе PostgreSQL.

В моей базе данных у меня есть две таблицы:

Table category
-----------------
pro_cat_id int,
pro_cat_name text

Table product_list
---------------------------------------------------
pro_id int,
pro_name text,
pro_cat_id int (foreign key to category.pro_cat_id)

У меня может быть 5-6 значение в таблице категорий.Поэтому я написал запрос, который выглядит следующим образом:

SELECT pro_id, pro_name, pro_cat_id
FROM pro_list
WHERE pro_cat_id = 65
LIMIT 18

UNION ALL 

SELECT pro_id, pro_name, pro_cat_id
FROM pro_list 
WHERE pro_cat_id = 80 
LIMIT 18

Итак, я хочу написать один простой запрос с использованием цикла, чтобы запрос был динамическим.

Итак, значение вкатегории могут измениться.Администратор может добавить некоторые возможные значения категории.Если бы я не использовал цикл, код был бы статическим.Чтобы сделать его динамичным, я хочу использовать цикл

1 Ответ

0 голосов
/ 07 октября 2018

Циклы в PostgreSQL доступны только в хранимых процедурах / функциях.Но я не уверен, что вам действительно нужен цикл для вашей задачи:


демо: db <> fiddle (с ограничением == 5)

SELECT pro_id, pro_name, pro_cat_id 
FROM (
    SELECT 
        pro_id, 
        pro_name, 
        pro_cat_id, 
        row_number() OVER (PARTITION BY pro_cat_id) 
    FROM pro_list
    WHERE pro_cat_id IN (65, 80) -- changing the category list
)s
WHERE row_number <= 18           -- changing the product limit

Вы можете просто изменить pro_cat_id list во внутреннем предложении WHERE.Если вы хотите изменить категории, просто измените этот список.Это зависит от вашего внутреннего кода и от того, как вы хотите изменить идентификаторы категории: вы должны иметь возможность передавать список или массив в запрос в качестве параметра.Поэтому ваш код может выглядеть следующим образом:

... WHERE pro_cat_id IN ?      -- for lists, as demonstrated
... WHERE pro_cat_id = ANY(?)  -- for arrays (see fiddle) 

Чтобы ограничить продукты, вы можете изменить значение во внешнем предложении WHERE.

Функция окна row_number() (https://www.postgresql.org/docs/current/static/tutorial-window.html) создает количество строк для каждой категории. Таким образом, вы можете фильтровать по максимальному количеству строк.


Редактировать : Здесь объясняется, как передать массив вSQL-запрос в PHP

$sql = "<the query from above> WHERE pro_cat_id IN ('$categoryIds')";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...