postgresql-join表

jmo0nnb3  于 2021-07-05  发布在  Java
关注(0)|答案(1)|浏览(315)

我想显示一个用户从每个商店的购买摘要,最多从每个商店前3次购买。为了简单起见,购买数量是不可配置的。所以,它不是第一个n,而是第一个3
假设我有这些列的表

Store
    id
    name

Product
    id
    name
    storeId
    price

Purchase
    id
    userId
    productId
    count
    purchaseTime

这就是我想展示的

-----------------------------------------------
| store     | product         | count | price |
-----------------------------------------------
| disney    | stitch doll     | 1     | 30  |
|           | donald cap      | 3     | 15  |
|           | ticket          | 2     | 100 |
-----------------------------------------------
| universal | iron man figure | 1     | 100 |
|           | batman figure   | 1     | 90  |
-----------------------------------------------

优选地,如果用户在两次单独的购买中购买唐老鸭(假设价格永远不会改变),那么购买的数量将被合并
例如:如果用户购买2个唐老鸭,然后购买1个唐老鸭,结果将是3个唐老鸭-而不是2唐老鸭和1唐老鸭
我正在使用hibernate和postgresql
我甚至不知道从哪里开始,尤其是如何将每家店的购买量限制为每家店3次
任何提示,psudo解决方案或解决方案将不胜感激
谢谢
注:不幸的是,我有一个重大疏忽。我想我想把每一个摘要放在一行中
例如

id | Store     | Product1        | count1 | price1 | Product2      | count2 | price2 | Product3 | count3 | price3
----------------------------------------------------------------------------------------------------------------------------------
2  | Disney    | stitch doll     | 1      | 30     | donald cap    | 3      | 15     | ticket    | 2     | 100
5  | Universal | iron man figure | 1      | 100    | batman figure | 1      | 90     | null      | null  | null

原因是:我需要对结果分页-每页显示10个采购摘要如果每个摘要返回1-3行,则很难计算出下一页的结果

kmynzznz

kmynzznz1#

您可以使用横向联接检索每个商店的前3次购买:

select s.name, p.*
from store s
cross join lateral (
    select pr.name as product, pu.count, pr.price
    from purchase pu
    inner join product pr on pr.id = pu.productid
    where pr.storeid = s.id and pu.userid = ?
    order by pu.purchasetime
    limit 3
) p

或者,您可以使用 row_number() :

select *
from (
    select pr.name as product, pu.count, pr.price,
        row_number() over(partition by s.id order by pu.purchasetime) rn
    from purchase pu
    inner join product pr on pr.id = pu.productid
    inner join store s on s.id = pr.storeid 
    where pu.userid = ?
) t
where rn <= 3

相关问题