查询每个商店随机获得4个产品

时间:2017-01-03 10:36:49

标签: sql postgresql

如果产品库存,我试图为每个商店显示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,在循环中查询一次或多次也更好吗?

1 个答案:

答案 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会“大致”返回百分比,也许会更多或更少,这就是我们限制返回行数的原因。