我有2个模型:Product
和Sku
,其中Product
有很多Sku
s
我试图想出一个搜索&排序界面,我有过滤器适用于产品类别等。我的问题是如何根据skus的价格返回排名产品。
例如:
product | id: 1
product | id: 2
product | id: 3
# Skus for Product 1
sku | id: 1, product_id: 1, price: 1111
sku | id: 5, product_id: 1, price: 5555
sku | id: 9, product_id: 1, price: 9999
# Skus for Product 2
sku | id: 2, product_id: 2, price: 2222
sku | id: 3, product_id: 2, price: 3333
sku | id: 4, product_id: 2, price: 4444
# Skus for Product 3
sku | id: 6, product_id: 3, price: 6666
sku | id: 7, product_id: 3, price: 7777
sku | id: 8, product_id: 3, price: 8888
按价格从低到高排序"应该回来:
[ product 1, product 2, product 3 ]
而"价格从高到低"应该回来:
[ product 1, product 3, product 2 ]
对于3种产品来说这很简单,但是我很难搞清楚分页(即成千上万的产品,具有一致的偏移等)。
似乎它应该是group by
的某种组合,然后按sku
搜索,然后找到相应的product
。有没有一种简单的方法在Postgres中进行这种排序?
更新
这与引用的"重复"不同。我这里有2个模型,并希望根据其子项的值对一个模型进行排序。引用的副本只有一个模型。
对于边缘情况:a" tie"然而,只要它是一致的,可以处理sku价格(例如skus的id asc
)。产品没有可订购的值,并且DB中没有重复的产品。
答案 0 :(得分:1)
按每个价格范围的最小值排序:
SELECT id
FROM (
SELECT p.id, min(s.price) as min_price
FROM product p
JOIN sku s on p.id = s.product_id
GROUP BY p.id
) x
ORDER BY min_price ASC
你可能想要这个
SELECT p.productid
from (
SELECT p.productid, s.price,
ROW_NUMBER() OVER (PARTITION BY p.productid, ORDER BY s.price ASC) as rn
from product p
JOIN sku s on p.id = s.product_id
) x
where rn = 1
和这个
SELECT p.productid
from (
SELECT p.productid, s.price,
ROW_NUMBER() OVER (PARTITION BY p.productid, ORDER BY s.price DESC) as rn
from product p
join sku s on p.id = s.product_id
) x
where rn = 1
但正如我所说,我仍然不确定您是按价格订购还是删除重复产品(如此),或者您是否要按每个产品价格范围的最小值和最大值进行订购(如"重复"确实如此。