我需要进行查询,检索不同列的“最后”记录。
我有一个模型,Languages,有3列:
Locale -> es | en | de
Version -> 1 | 2 | 3
Data -> aaa | bbb | ccc
按区域设置可以存在重复的记录,而不是版本。例如:
es | 1 | aaa
es | 2 | aab
es | 3 | aba
en | 1 | bbb
en | 2 | bab
在该示例中,我需要检索此结果:
es | 3 | aba
en | 2 | bab
将会有最后两个版本的语言。我现在正在做这个查询:
Language.all.order('created_at desc').group(:locale)
但我得到了:
es | 2 | aba
en | 1 | bab
有什么想法吗?提前谢谢!
答案 0 :(得分:1)
谢谢大家的回答!这是结果!
即使第一个选项是正确的,在另一个评论之后,这是最终版本并且是我正在使用的版本(我认为对我的环境更正确):
Language.all.group_by(&:locale).map{|s| s.last.last}
如果这对某人有帮助,那么在蒂姆的回答之后,这对我有用:
query = "SELECT lang1.* " +
"FROM languages lang1 INNER JOIN " +
"(" +
"SELECT l.locale, MAX(l.version) AS max_version " +
"FROM languages l " +
"GROUP BY l.locale" +
") lang2 " +
"ON lang1.locale = lang2.locale AND lang1.version = lang2.max_version"
languages = Language.find_by_sql(query)
也许在ruby中有一个更清洁的解决方案,但这会检索到正确的结果!
答案 1 :(得分:0)
这是一个原始的MySQL查询,它将为您提供所需的结果集:
SELECT lang1.*
FROM Languages lang1 INNER JOIN
(
SELECT l.Locale, MAX(l.Version) AS MaxVersion
FROM Languages l
GROUP BY l.Locale
) lang2
ON lang1.Locale = lang2.Locale AND lang1.Version = lang2.MaxVersion
我不是一个Ruby人,所以这对我提供的帮助很大。我希望你知道如何将MySQL查询翻译成你在OP中的查询语言。