Mysql Rails查询选择具有不同列的最后一条记录
我需要进行一个查询,从中检索不同列的“最后”记录 我有一个模型“语言”,它有3列:Mysql Rails查询选择具有不同列的最后一条记录,mysql,sql,ruby-on-rails,activerecord,Mysql,Sql,Ruby On Rails,Activerecord,我需要进行一个查询,从中检索不同列的“最后”记录 我有一个模型“语言”,它有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 | b
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
有什么想法吗?提前谢谢 这是一个原始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
我不是一个喜欢红宝石的人,所以这是我能提供的最大帮助。我希望您知道如何将MySQL查询翻译成OP中的查询语言。谢谢大家的回答!这就是结果 第二种选择 即使第一个选项是正确的,在另一条评论之后,这也是最终版本,也是我正在使用的版本(我认为它更适合我的环境): 第一选择 如果这对某人有帮助,这就是在Tim的回答之后对我起作用的原因:
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中有一个更干净的解决方案,但这会检索到正确的结果 版本是按顺序创建的,因此在desc创建的是正确的:)这将有助于
语言.all.groupby(&:locale.map{s|s.last.last}
非常感谢!这确实起到了作用:)非常感谢!真管用!我不知道rails中是否有更好的解决方案,但我将用结果更新我的问题!再次感谢!但这并不能回答OP问题:Rails查询选择具有不同列的最后一条记录我更新了结果,因为这两条记录都是有效的。也许SQL会帮助别人!谢谢大家!
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)