Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Rails查询选择具有不同列的最后一条记录_Mysql_Sql_Ruby On Rails_Activerecord - Fatal编程技术网

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

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

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

我有一个模型“语言”,它有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

有什么想法吗?提前谢谢

这是一个原始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)