作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对在我的 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
所以我想要的是使用循环编写一个简单的查询,以便查询是动态的。
因此类别中的值可能会发生变化。管理员可以添加一些可能的类别值。如果我不使用循环,代码将是静态的。为了使其动态,我想使用循环
最佳答案
PostgreSQL 中的循环仅在存储过程/函数中可用。但我不确定你是否真的需要一个循环来解决你的问题:
demo: 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
您可以简单地更改内部 WHERE
子句中的 pro_cat_id 列表
。如果您想更改类别,只需更改此列表即可。这取决于您的后端代码以及您希望如何更改类别 ID:您应该能够将列表或数组作为参数传递到查询中。所以你的代码可以看起来像:
... 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) 为每个类别创建行计数。因此,您可以按最大行数进行过滤。
编辑: Here is explained how to pass an array into an sql query in PHP
$sql = "<the query from above> WHERE pro_cat_id IN ('$categoryIds')";
关于php - 如何在 PostgreSQL 中实现循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52687329/
我是一名优秀的程序员,十分优秀!