【问题标题】:activerecord ruby row with max value in mysql tablemysql表中具有最大值的activerecord ruby​​行
【发布时间】:2013-05-06 01:26:15
【问题描述】:

我需要从 MySQL 表 table1(如下所示)中选择具有不同 'foreign_row_id' 值的所有记录,并按最大 datetime 值对它们进行分组。例如,我应该从下表中选择 id=2 和 id=3 的行。在此之后,我必须将结果与带有phrase_id 的表连接起来。 在我的项目中,我只使用没有 Rails 的 Ruby 和 ActiveRecord。

+----+---------------------+----------------+--------------+
| id | datetime            | foreign_row_id | other_fields |
+----+---------------------+----------------+--------------+
|  1 | 2013-05-02 17:36:15 |              1 |            1 |
|  2 | 2013-05-02 17:36:53 |              1 |            1 |
|  3 | 2013-05-03 00:00:00 |              2 |            3 |
+----+---------------------+----------------+--------------+

这是我的红宝石代码:

@result=  Model1.joins(:foreign_row).
                 where(:user_id => user_id).
                 order(:datetime).
                 reverse_order.
                 select('table1.*, foreign_row.*').
                 maximum(:datetime, :group => :foreign_row_id).

它只给了我一条记录,没有按 id 分组并加入:{"1":"2013-05-02T17:36:53+09:00"}。 我应该在我的代码中进行哪些更改以获取所有行?

【问题讨论】:

    标签: mysql ruby activerecord


    【解决方案1】:

    我分部分解决了这个问题,首先我得到一个可以解决问题的SQL语句:

    SELECT * FROM (SELECT * FROM `models`  ORDER BY `datetime` desc) m  GROUP BY `foreign_row_id`
    

    然后我使用 Arel 构建了该查询:

    model_table = Model1.arel_table
    subquery = model_table.project(Arel.sql('*')).order('`datetime` desc').as('m')
    query = model_table.project(Arel.sql('*')).from(subquery).group('`foreign_row_id`')
    

    最后你可以运行那个查询了:

    Model1.find_by_sql query.to_sql
    

    我添加了一些反引号,因为我测试的字段是 SQL 保留字,我认为您可以省略它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-30
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多