【问题标题】:Mysql2 Error - using COALESCE, Unknown column in where clauseMysql2 错误 - 在 where 子句中使用 COALESCE,未知列
【发布时间】:2018-02-07 06:07:16
【问题描述】:

在我的 Rails 4.1 应用程序中,我正在构建一个查询,以通过多态关系(买方)的属性(名称)在我的集合(订单)中查找记录。该多态有 2 个可能的表,所以我使用 2 LEFT JOINS + COALESCE 来合并属性。然后尝试在 where 子句中使用 COALESCE 中的值。

我的 ActiveRecord 模型中的方法如下所示:

class Order
  ...
  scope :join_by_buyer_name, -> { select("stock_orders.*", "COALESCE(core_customers.business_name, core_entities.name) AS buyer_name")
      .joins("LEFT JOIN core_customers ON stock_orders.buyer_id = core_customers.id AND stock_orders.buyer_type='Core::Customer'")
      .joins("LEFT JOIN core_entities ON stock_orders.buyer_id = core_entities.id AND stock_orders.buyer_type='Core::Entity'")
    }
  ...

  def find_by_buyer_name(term)
    all.join_by_buyer_name.where("buyer_name LIKE ?", term)
  end


end

当 ActiveRecord 查询被执行时,它看起来像这样

SELECT stock_orders.*, COALESCE(core_customers.business_name, core_entities.name) AS buyer_name
FROM `stock_orders`
LEFT JOIN core_customers ON stock_orders.buyer_id = core_customers.id AND stock_orders.buyer_type='Core::Customer'
LEFT JOIN core_entities ON stock_orders.buyer_id = core_entities.id AND stock_orders.buyer_type='Core::Entity'
WHERE `stock_orders`.`type` IN ('Stock::SalesOrder') AND (buyer_name LIKE "blah")

直到最近这才有效,但是我开始收到以下错误:

Mysql2::Error: Unknown column 'buyer_name' in 'where clause': SELECT stock_orders.*, COALESCE等等等等等等

它非常适合按 COALESCE 值排序 - 即 collection.order("buyer_name asc") 以及直到最近 where 查询也完美运行...

我不确定发生了什么变化,并且在 Rails 或 Mysql 文档中看不到任何内容。你能看出这里有什么问题吗?请帮忙!

【问题讨论】:

    标签: mysql ruby-on-rails activerecord


    【解决方案1】:

    您不能在从SELECT 子句创建的WHERE 子句中使用ALIAS。改用计算列,

    AND (COALESCE(core_customers.business_name, core_entities.name) LIKE "blah")
    

    如果你想使用ALIAS,你必须像下面的查询一样将它包装在子查询中,

    SELECT *
    FROM
         (
         SELECT stock_orders.*, 
               COALESCE(core_customers.business_name, core_entities.name) AS buyer_name
         FROM `stock_orders`
              LEFT JOIN core_customers 
                    ON stock_orders.buyer_id = core_customers.id 
                         AND stock_orders.buyer_type='Core::Customer'
              LEFT JOIN core_entities 
                         ON stock_orders.buyer_id = core_entities.id 
                         AND stock_orders.buyer_type='Core::Entity'
         ) subquery
    WHERE `type` IN ('Stock::SalesOrder') 
          AND (buyer_name LIKE "blah")
    

    【讨论】:

      猜你喜欢
      • 2014-05-30
      • 2021-12-24
      • 1970-01-01
      • 2012-04-25
      • 2015-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多