如果产品库存,我试图为每个商店显示4个随机产品。我有3个表:一个用于商店信息 - “ws_shop_official”,一个用于产品 - “ws_product”和一个用于存储产品图像信息 - “ws_product_pic”。
使用下面的语句,返回的结果是随机的,但我没有得到每个商店返回的4个产品(行)。
select prod.product_id,prod.shop_id,prod.product_name,prod.normal_price,prod.stock,prod.create_time,prod.product_id,official.shop_id,img.file_name,img.file_path
from ws_product prod
join ws_shop_official official ON prod.shop_id = official.shop_id
join ws_product_pic img ON prod.product_id = img.product_id
where prod.stock > 0 AND prod.shop_id IN (select shop_id from ws_shop_official where status=1 )
order by prod.create_time DESC
任何人对如何修复都有任何想法?
预期的解决方案是每个商店4个产品信息行。 对于每个商店ID,在循环中查询一次或多次也更好吗?
答案 0 :(得分:0)
我们使用PL / PgSQL,首先我们计算符合特定搜索条件的总行数:
recnum := count(p.id) from
stt_group g,
stt_product p
left join
stt_image i
on
i.product = p.id
and
i.is_default = true
and
i.is_public = true
where
p.pgroup = g.id
and
g.id = group_id
and
p.online_shop = true;
然后我们计算所有记录与我们想要的行数相对应的百分比,我们在'size'变量中有:
percentage := 100.0 * size::numeric / recnum::numeric;
if percentage > 100.0 then
percentage = 100.0;
end if;
最后,我们使用tablesample来记录所需的随机百分比:
return query select
p.id,
p.name,
p.price,
p.stock_qty,
p.stock_minqty,
i.id,
p.nr
from
stt_group g,
stt_product p tablesample bernoulli(percentage)
left join
stt_image i
on
i.product = p.id
and
i.is_default = true
and
i.is_public = true
where
p.pgroup = g.id
and
g.id = group_id
and
p.online_shop = true
order by
p.name
limit
size;
虽然这样做有效,但请记住,tablesample会“大致”返回百分比,也许会更多或更少,这就是我们限制返回行数的原因。