【问题标题】:SQL - Order records by the closest valueSQL - 按最接近的值排序记录
【发布时间】:2018-02-01 13:09:44
【问题描述】:

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

所以对于类似的产品场景如下 1) 价格明智(+10 和 -10) 2)然后在类别之后(来自同一类别)

例如 我的产品编号为 #30,价格为 30 美元,类别为“啤酒” 所以类似的产品列表将如下所示 首先显示所有产品啤酒类别产品,范围在 30 美元的 +10 和 -10 之间(我的意思是黑白范围 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 查询解决此问题?

【问题讨论】:

    标签: ruby-on-rails postgresql


    【解决方案1】:

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

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

    【讨论】:

    • 让我先试试
    【解决方案2】:

    如果价格来自不受信任的用户输入,则使用前面的答案很危险,因为它允许 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 2018-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多