对子模型的价格属性进行排序

时间:2015-10-28 05:53:03

标签: sql postgresql sorting

我有2个模型:ProductSku,其中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中没有重复的产品。

1 个答案:

答案 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

但正如我所说,我仍然不确定您是按价格订购还是删除重复产品(如此),或者您是否要按每个产品价格范围的最小值和最大值进行订购(如"重复"确实如此。