【问题标题】:Rails query selecting last record with distinct columnRails查询选择具有不同列的最后一条记录
【发布时间】:2015-07-30 10:04:12
【问题描述】:

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

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

会有一种语言的最后 2 个版本。我现在正在做这个查询:

Language.all.order('created_at desc').group(:locale)

但我得到了:

es | 2 | aba
en | 1 | bab

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

【问题讨论】:

  • 版本已按顺序创建,因此 created_at desc 是正确的:)
  • 这会帮助Language.all.group_by(&:locale).map{|s| s.last.last}
  • 非常感谢阿塔尔!这实际上完成了工作:)

标签: mysql sql ruby-on-rails activerecord


【解决方案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​​ 有一个更清洁的解决方案,但这会检索到正确的结果!

【讨论】:

    【解决方案2】:

    这是一个原始的 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 中使用的查询语言。

    【讨论】:

    • 非常感谢!这样可行!我不知道 Rails 中是否有更好的解决方案,但我将用结果更新我的问题!再次感谢!
    • 但这并没有提供对 OP 问题的答案:Rails 查询 选择具有不同列的最后一条记录
    • 我更新了结果,因为两个都是有效的。也许 SQL 会帮助某人!谢谢大家!
    猜你喜欢
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 2015-07-24
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多