【问题标题】:Mysql2::Error: Column in field list is ambiguousMysql2::Error: 字段列表中的列不明确
【发布时间】:2015-12-04 11:14:01
【问题描述】:

我有 3 个表驱动程序、工作和tip_travel_time。而他们的联想是这样的

Class Job < ActiveRecord::Base
  belongs_to :driver, primary_key: :username
end

Class Driver < ActiveRecord::Base
  has_many :jobs, foreign_key: :driver_id, primary_key: :username
  has_many :tip_travel_times,foreign_key: :driver_id
end

class TipTravelTime < ActiveRecord::Base
  belongs_to :driver
end

现在我正在使用 activeadmin 并希望将这两个查询组合在一起

TipTravelTime.joins(:driver).where('users.runsheet_type IN (?,?,?)',Driver::LIQUID, Driver::FRONTLIFT, Driver::REARLIFT).group(:driver_id).select('ceil(avg(time_difference)/60) as average_time_in_minutes, driver_id').order(:driver_id)

Job.joins(:driver).where('users.runsheet_type IN (?,?,?)',Driver::LIQUID, Driver::FRONTLIFT, Driver::REARLIFT).group(:driver_id).where('completed_at is not null and started_at is not null').select('ceil(AVG(completed_at - arrived_at)/60) as average_completion_time_in_minutes, driver_id').order(:driver_id)
enter code here

我通过以下查询将它们组合起来:

Driver.joins(:tip_travel_times, :jobs).where('runsheet_type IN (?,?,?)',Driver::LIQUID, Driver::FRONTLIFT, Driver::REARLIFT).group(:driver_id).where('jobs.completed_at is not null and jobs.started_at is not null').select('ceil(AVG(jobs.completed_at - jobs.arrived_at)/60) as average_completion_time_in_minutes, ceil(avg(tip_travel_times.time_difference)/60) as average_time_in_minutes, jobs.driver_id').order(:driver_id)

但最后一个查询返回给我以下错误:

Mysql2::Error: Column 'driver_id' in field list is ambiguous: SELECT COUNT(*) AS count_all, driver_id AS driver_id FROM users INNER JOIN tip_travel_times ON tip_travel_times.driver_id = users.id INNER JOIN jobs ON jobs.driver_id = users.username WHERE users.type IN ('Driver') AND (runsheet_type IN ('liquid','frontlift','rearlift')) AND (jobs.completed_at is not null and jobs.started_at is not null) GROUP BY driver_id LIMIT 10000 OFFSET 0

知道哪里出了问题或我能做些什么来实现这一点吗?

【问题讨论】:

  • 你有 JobTipTravelTime 两者都有 driver_id 列因此模棱两可
  • @j-dexx 我们如何避免这种情况并在 rails activerecord 方法中使用表名?
  • 看起来可能只是最后的顺序,rails 将默认按驱动程序的 id 进行排序,因为您正在查询驱动程序,因此您可能只能删除 order 子句

标签: mysql ruby-on-rails join activerecord activeadmin


【解决方案1】:

column nametable name 一起使用,例如tip_travel_times.driver_id

您的查询是这样的:-

SELECT COUNT(*) AS count_all, 
tip_travel_times.driver_id AS driver_id 
FROM users.....

【讨论】:

【解决方案2】:

如果两个表有相似的列,那么在表连接中就会出现歧义问题。

您的查询将是

TipTravelTime.joins(:driver).where('users.runsheet_type IN (?,?,?)',Driver::LIQUID, Driver::FRONTLIFT, Driver::REARLIFT).group("tip_travel_times.driver_id").select('ceil(avg(time_difference)/60) as average_time_in_minutes, tip_travel_times.driver_id').order("tip_travel_times.driver_id asc")

Job.joins(:driver).where('users.runsheet_type IN (?,?,?)',Driver::LIQUID, Driver::FRONTLIFT, Driver::REARLIFT).group("jobs.driver_id").where('completed_at is not null and started_at is not null').select('ceil(AVG(completed_at - arrived_at)/60) as average_completion_time_in_minutes, jobs.driver_id').order("jobs.driver_id asc")

如果您希望按作业表中包含的 driver_id 分组,那么

Driver.joins(:tip_travel_times, :jobs).where('runsheet_type IN (?,?,?)',Driver::LIQUID, Driver::FRONTLIFT, Driver::REARLIFT).group("jobs.driver_id").where('jobs.completed_at is not null and jobs.started_at is not null').select('ceil(AVG(jobs.completed_at - jobs.arrived_at)/60) as average_completion_time_in_minutes, ceil(avg(tip_travel_times.time_difference)/60) as average_time_in_minutes, jobs.driver_id').order("jobs.driver_id asc")

如果您希望按tip_travel_times 表中包含的driver_id 分组,那么

Driver.joins(:tip_travel_times, :jobs).where('runsheet_type IN (?,?,?)',Driver::LIQUID, Driver::FRONTLIFT, Driver::REARLIFT).group("tip_travel_times.driver_id").where('jobs.completed_at is not null and jobs.started_at is not null').select('ceil(AVG(jobs.completed_at - jobs.arrived_at)/60) as average_completion_time_in_minutes, ceil(avg(tip_travel_times.time_difference)/60) as average_time_in_minutes, tip_travel_times.driver_id').order("tip_travel_times.driver_id asc")

而不是

TipTravelTime.joins(:driver).where('users.runsheet_type IN (?,?,?)',Driver::LIQUID, Driver::FRONTLIFT, Driver::REARLIFT).group(:driver_id).select('ceil(avg(time_difference)/60) as average_time_in_minutes, driver_id').order(:driver_id)

Job.joins(:driver).where('users.runsheet_type IN (?,?,?)',Driver::LIQUID, Driver::FRONTLIFT, Driver::REARLIFT).group(:driver_id).where('completed_at is not null and started_at is not null').select('ceil(AVG(completed_at - arrived_at)/60) as average_completion_time_in_minutes, driver_id').order(:driver_id)

享受...

【讨论】:

  • 这两个查询运行良好的问题是第三个是两者的组合
【解决方案3】:

试试下面,如果这对你有帮助,请告诉我?将 :drive_id 更改为 'table_name.drive_id'

Driver.joins(:tip_travel_times, :jobs).where('runsheet_type IN (?,?,?)',Driver::LIQUID, Driver::FRONTLIFT, Driver::REARLIFT).group('table_name.driver_id').where('jobs.completed_at is not null and jobs.started_at is not null').select('ceil(AVG(jobs.completed_at - jobs.arrived_at)/60) as average_completion_time_in_minutes, ceil(avg(tip_travel_times.time_difference)/60) as average_time_in_minutes, jobs.driver_id').order('table_name.driver_id')

【讨论】:

    猜你喜欢
    • 2016-07-07
    • 2020-09-01
    • 2020-07-30
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多