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

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

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

例如,我的产品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查询解决这个问题?

是的,您可以通过使用简单的订单查询来执行此操作,如下所示

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

如果价格来自不受信任的用户输入,则之前的答案是危险的,因为它允许SQL注入。 如果价格可以nil它也会中断。

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

 class Product < ActiveRecord::Base scope :closest_by_price, ->(price) { quoted_price = connection.quote(price, columns_hash["price"]) order("abs(products.price - #{quoted_price})") } end Product.closest_by_price(50.0)