1

我需要从 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"}。我应该在我的代码中更改什么以获取所有行?

4

1 回答 1

0

我分部分解决了这个问题,首先我得到一个可以解决问题的 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 保留字,我认为您可以省略它们。

于 2013-05-06T03:03:40.597 回答