SQL - 按最接近的值排序记录

时间:2018-02-01 13:09:45

标签: ruby-on-rails postgresql

我为产品详细信息创建了一个API 在这个API中,我还需要附上类似的产品作为回应。

因此对于类似产品的情况如下 1)价格明智(+10和-10) 2)然后在类别明智之后(来自同一类别)

e.g。 我的产品ID为#30,价格为30美元,类别为“啤酒” 所以类似的产品列表将如下所示 首先展示所有产品啤酒类产品介于+10和-10之间的30美元(我的意思是b / w范围20到40) 然后附上属于同一类别“啤酒”的其他产品,最接近的价格为30美元 假设具有相同类别的产品价格如下 10美元,17美元,45美元,42美元,50美元

因此,产品将按照以下方式排序为30美元 $ 42($ 42 - $ 30 = 12),$ 17($ 30 - $ 17 = 13),$ 45($ 45 - $ 30 = $ 15),$ 10($ 30 - $ 10 = $ 20),$ 50($ 50 - $ 30 = $ 20)

我在下面的查询

中创建的+10 -10范围内的类似产品
similar_price = Product.includes(:sub_category, :brand, :product_type, :category).in_stock.where("(actual_price BETWEEN ? AND ? AND category_id = ? ) ", min_price, max_price, self.category_id)

现在我需要订购价格最近的产品。 如何在rails中使用postgres查询修复此问题?

2 个答案:

答案 0 :(得分:2)

是的,您只需使用简单的订单查询即可执行此操作,如下所示

`Product.where("product.category_id = ?", "category_id").order("abs(products.price - #{your_selected_product_price})")`

答案 1 :(得分:1)

如果价格来自不受信任的用户输入,则使用前一个答案很危险,因为它允许SQL注入。如果价格可以为 // register form form(method='POST' enctype='multipart/form-data' action='/register') div.form-group label(for='avatar') avatar: input#avatar.form-control(type='file', accept='image/*' name='avatar') ,它也会中断。

解决方案是正确报价给定列的价格:

nil