【问题标题】:Nested SQL select query and writing it with Rails嵌套 SQL 选择查询并用 Rails 编写
【发布时间】:2013-03-15 17:18:58
【问题描述】:

我所拥有的是一个 Skus 模型/表格,其中有几个代表类别的列。还有三列用于描述主要、次要、微格式的版本号。

我想根据三个 Sku 类别选择每个 Sku 的最高版本。

最初我尝试使用 MAX 和 'group',但在三个版本号列中效果不佳(0 0 5 被认为大于 0 1 0)。所以我在三个版本列上使用“order by”,然后使用“group by”执行“select”,得到我想要的结果:


SELECT * FROM 
(
  SELECT *
  FROM skus
  WHERE category1_id = 3
  ORDER BY ver_major, ver_minor, ver_micro
) 
GROUP BY category2_id, category3_id, category4_id

我想知道的是,这是否特别低效(因为嵌套选择或其他原因)?

最重要的是,我将如何使用 Rails ActiveRecord 编写这个(或更好的)查询?

感谢您的帮助

【问题讨论】:

  • 它没有解决您的问题,但是您的表是否有关于 ver_major、ver_minor、ver_micro、category2_id、category3_id 和 category4_id 的索引?它将帮助您的数据库引擎计算 ORDER BY 和 GROUP BY。
  • 这也不能解决您的问题,但最好养成避免“SELECT *”的习惯,除非您需要每一列的数据。只选择你需要的列,你的查询时间会小很多。
  • 感谢您的回复。我确实有关于类别的索引。我也不会将 * 用于 SELECT,但会简化问题。我的主要问题是如何使用 Rails ActiveRecord 方法来表示这样的东西。

标签: mysql sql ruby-on-rails activerecord


【解决方案1】:

从数据库设计的角度来看,将类别 ID 放入 skus 表中绝不是一个好主意。

一个sku可能有很多分类,一个分类可能有很多sku。您需要一个包含两个字段(sku_id 和 category_id)的连接表来存储关系。

Rails 中的建模看起来像

class Sku < ActiveRecord::Base
  has_and_belongs_to_many :categories
end

class Category < ActiveRecord::Base
  has_and_belongs_to_many :skus
end

参考:http://guides.rubyonrails.org/association_basics.html#the-has_and_belongs_to_many-association

【讨论】:

  • 感谢您的回复。关系实际上是每个SKU都有一个类别的ID。类别可能是一个坏词,属性可能更好; property_thing1_id、property_thing2_id 等
猜你喜欢
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2019-05-06
  • 1970-01-01
  • 2013-02-01
  • 2014-07-23
  • 1970-01-01
相关资源
最近更新 更多