Rails查询选择具有不同列的最后一条记录

时间:2015-07-30 10:04:13

标签: mysql sql ruby-on-rails activerecord

我需要进行查询,检索不同列的“最后”记录。

我有一个模型,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

有什么想法吗?提前谢谢!

2 个答案:

答案 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中的查询语言。