【问题标题】:Get values from 3 different tables based on specific condition根据特定条件从 3 个不同的表中获取值
【发布时间】:2012-10-31 12:25:25
【问题描述】:

我的数据库中有 3 个表

  1. 用户(ID、用户名、电子邮件、密码等)
  2. 生产者(id、user_id)
  3. 地址(名字、城市、addressable_id 等)

Producer 与用户表(User.id = Producer.user_id)和地址表(p.id = Address.addressable_id)有链接

现在我想用他的用户名获取所有生产者地址

我正在尝试以下查询,但它没有给出预期的输出

select u.login, p.id, a.city from producers p

join users u on u.id = p.user_id

join addresses a on a.addressable_id = p.id

我的模型和关系

user.rb

class User < ActiveRecord::Base
  has_one :customer
  has_one :producer
end

producer.rb

class Producer < ActiveRecord::Base
  belongs_to :user
  belongs_to :updated_by_user, :class_name => "User", :foreign_key => "updated_by_user_id"

  has_one :address, :as => :addressable
  has_many :items  
end

address.rb

class Address < ActiveRecord::Base
  belongs_to :addressable, :polymorphic => true

  belongs_to :updated_by_user, :class_name => "User", :foreign_key => "updated_by_user_id"
end

【问题讨论】:

  • 您能否包含addresses 表结构的其余部分?您当前正在将addressable_id 加入到producers 唯一id - 您可能应该将addresses 表上的producer_id 字段加入producers 唯一id
  • @MarkBannister 不,我没有在地址表中添加 producer_id 字段,addressable_id 等于 producer_id
  • 我不是说你应该添加一个 producer_id 字段,我是说我认为可能有一个已经存在 - 请重新阅读我的内容写道。如果它们具有相同的密钥,那么拥有单独的生产者和地址表似乎有点毫无意义 - 请记住,“密钥,整个密钥,只有密钥”。
  • @MarkBannister 嘿对不起我的解释不好,为什么我在不同的表中添加地址是我有不同类型的用户,比如生产者,我有客户、员工等,每个用户有自己的地址

标签: sql ruby-on-rails database ruby-on-rails-2


【解决方案1】:

您将需要使用ActiveRecord::Relation (docs) 的#select 方法。

Rails 3.X:

Producer.joins(:user, :address).select("users.login, producers.id, addresses.city")

Rails 2.X:

Producer.all(:joins => [:user, :address], :select => "users.login, producers.id, addresses.city")

【讨论】:

  • 哇,这可以在 rails 2.3.5 上运行吗?我会试试看,一会儿让你知道。谢谢
  • 美丽。我喜欢红宝石的纯净。我提供的答案是如果他想使用原始 sql。
  • @digaomatias 谢谢我还没有通过代码尝试过。我先在 SQL 中尝试
  • 好像rails 2.3.5中没有joins方法
  • 我收到此错误 ActiveRecord::ConfigurationError: 未找到名为“用户”的关联;也许你拼错了?
【解决方案2】:

您的查询看起来没问题。

尝试从“join”更改为“left join”,看看结果如何。

select u.login, p.id, a.city from producers p

left join users u on u.id = p.user_id

left join addresses a on a.addressable_id = p.id

其背后的原因是可能缺少其中一个 id,从而删除了整个结果。 如果是这种情况,您将能够看到一些具有 NULL 值的列。

【讨论】:

  • btw in mysql left joinleft outer join 相同。外部是可选的,但有时对某些人来说更清晰。
  • 我总是在 sql server 中使用“左连接”。也许这就是为什么我认为它比添加一个词来指定相同的行为更清楚。我猜只是偏好问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
相关资源
最近更新 更多