为标题道歉,因为我不知道如何简洁地描述我的问题。
假设我们在数据库中有多个Item
个实例,其中包含以下列:name
,year
和version
。示例如下:
| id | name | year | version |
|----|-----------|--------|---------|
| 1 | Blockhead | 2010 | 1 |
| 2 | Blockhead | 2010 | 2 |
| 3 | Jughead | 2011 | 1 |
我想只返回名称和年份唯一的结果,但只返回该名称/年唯一性组合的最新版本。即,我想回来:
| id | name | year | version |
|----|-----------|--------|---------|
| 2 | Blockhead | 2010 | 2 |
| 3 | Jughead | 2011 | 1 |
如果可能,我希望没有分组数据集...但我对SQL / AR的了解在这方面是有限的,我不知道适当的解决方案是什么。我目前检索所有记录,然后筛选出我不想要的记录,但这是一个不优雅的解决方案。
@items = ::Item.active.paginate(per_page: 30, page: page || 1).to_a
# Do not show a given item unless it's the latest version
@items.delete_if do |item|
@items.any? do |other|
other.id != item.id &&
other.read_attribute(:name) == item.read_attribute(:name) &&
other.year == item.year &&
other.version > item.version
end
end
答案 0 :(得分:0)
查看相关的SO问题:Retrieving the last record in each group
在您的情况下,选择必要数据的最简单查询将是:
SELECT name, year, MAX(version) as version
FROM items
GROUP BY name, year;
如果要选择其他列(例如id
)或避免分组结果,可以使用子查询执行此操作:
SELECT * FROM items
WHERE id IN (
SELECT MAX(id)
FROM items
GROUP BY name, year);
此代码假设MAX(id)
为该行中的id
提供了该组中最新的version
。
此查询的Rails代码:
sub_query = Item.select("MAX(id)").group(:name, year).to_sql
Items.where("id iN (?)", subquery)