【问题标题】:Way to differentiate ActiveRecord::Base.connection mysql joined query result?区分ActiveRecord::Base.connection mysql加入查询结果的方法?
【发布时间】:2018-05-22 08:25:28
【问题描述】:

我的查询:

records = ActiveRecord::Base.connection.execute("SELECT * FROM leads WHERE leads.status=1 AND leads.account_id=1 AND leads.id > 253380")

结果:

    records.first
[253381, 1, "first", "king", "CEO", "Jewelry & Toys", "11111", "22222", nil, nil, nil, nil]

    records.fields
["id", "account_id", "first_name", "last_name", "job_title", "department", "work_number", "mobile_number", "address", "city", "state", "zipcode"]

到目前为止一切都很好,但现在当我离开查询时,如下所示:

records = ActiveRecord::Base.connection.execute("SELECT * FROM leads LEFT JOIN lead_details ON lead_details.id=leads.id AND lead_details.account_id = leads.account_id WHERE leads.status=1 AND leads.account_id=1 AND leads.id > 253380")

结果:

    records.first
[253381, 1, "first", "king", "CEO", "Jewelry & Toys", "11111", "22222", nil, nil, nil, nil, nil, nil, nil, nil]

    records.fields
["id", "account_id", "first_name", "last_name", "job_title", "department", "work_number", "mobile_number", "address", "city", "state", "zipcode", "id", "account_id", "stars", "score"]

注意:最后一个数组"id", "account_id", "stars", "score"是连接表的列

当我尝试将记录转换为哈希第二个idaccount_id 将覆盖第一个idaccount_id,结果将是这样的

{"id"=>nil,
   "account_id"=>nil,
   "first_name"=>"first",
   "last_name"=>"king",
   "job_title"=>"CEO",
   "department"=>"Jewelry & Toys",
   "work_number"=>"11111",
   "mobile_number"=>"22222",
   "address"=>nil,
   "city"=>nil,
   "state"=>nil,
   "zipcode"=>nil,
   "stars"=>nil,
   "score"=>nil
  }

如何解决这种数据覆盖问题?有什么方法可以根据表名或其他东西将查询结果分区为嵌套数组?

【问题讨论】:

  • 我认为覆盖是因为#to_hashugar。在调用#to_hashugar 之前,你能展示一下llead 的样子吗?
  • @maicher - [253381, 1, 'first', 'king', 'CEO', 'Jewelry & Toys', '11111', '22222', nil, nil, nil, nil,无,无,无,无]
  • 在上面的评论中 - 最后 4 个 nil 是lead_details 表。 Lead_details 表有列 - id、account_id、stars、score。因此,由于lead_details 列(id,account_id)被覆盖。有什么方法可以在连接时根据表区分 mysql2 查询结果??

标签: mysql ruby-on-rails ruby activerecord


【解决方案1】:

所以如果我理解正确的话,第二个表中的列会覆盖第一个表中的列。

我建议不要选择不需要的列。

您可以通过在 SQL 中明确定义要加载第二个表中的哪些列来实现:“stars”和“score”。

"SELECT leads.*, lead_details.stars, lead_details.score FROM leads LEFT JOIN lead_details ON lead_details.id=leads.id AND lead_details.account_id = leads.account_id WHERE leads.status=1 AND leads.account_id=1 AND leads.id > 253380"

【讨论】:

  • 感谢您的回复@maicher。但问题是列数非常大,每张表接近 43,所以我不应该那样做。
猜你喜欢
  • 2013-12-14
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 2018-04-25
  • 1970-01-01
  • 1970-01-01
  • 2018-11-22
  • 2019-08-26
相关资源
最近更新 更多