2013-05-06 44 views
1

我需要從MySQL表table1(它顯示在下面)中選擇具有不同'foreign_row_id'值的所有記錄,並將它們按最大值datetime值分組。例如,從下面的表格中我應該選擇id = 2和id = 3的行。在此之後,我必須將結果與phrase_id的表一起加入。 在我的項目中,我只使用沒有Rails的Ruby和ActiveRecord。activerecord在mysql表中有最大值的ruby行

+----+---------------------+----------------+--------------+ 
| 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 | 
+----+---------------------+----------------+--------------+ 

這裏我的Ruby代碼:

@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"}。 我應該在我的代碼中更改以獲取所有行?

回答

0

我解決了這個由部分,首先我拿到這將解決問題的SQL語句:

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

然後我建有阿雷爾該查詢:

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 

我添加了一些back ticks,因爲我測試的字段是SQL保留字,我想你可以省略他們。