2017-08-08 316 views
0

我想基于列是唯一在那里我得到记录运行轨道的查询,在这种情况下,“ACCOUNT_ID”SELECT DISTINCT ON表达式必须初始ORDER BY表达式匹配

这完美的作品:

@comments = @store.comments.where(account_id: @selected_array).where(flagged: true).select('distinct on (account_id) *').paginate(:page => params[:page], :per_page => 30) 

除订单关闭外。当我试图通过创建日期订购:

@comments = @store.comments.where(account_id: @selected_array).where(flagged: true).select('distinct on (account_id) *').order("created_at DESC").paginate(:page => params[:page], :per_page => 30) 

我得到的错误:

PG::InvalidColumnReference: ERROR: SELECT DISTINCT ON expressions must match initial ORDER BY expressions 

如何让不同的部分,同时通过创建时间排序仍然有效?

回答

3

您需要将其包装为子查询,然后对其进行排序。

原始SQL将是:

SELECT * FROM (
    SELECT DISTINCT ON (account) * FROM comments WHERE account_id = 5 AND flagged 
) AS sub 
ORDER BY created_at DESC 

在轨我觉得这威力工作(使用Ruby的ActiveRecord或者没有经验):

@comments = @store.comments.from(@store.comments.where(account_id: @selected_array).where(flagged: true).select('distinct on (account_id) *')).order("created_at DESC").paginate(:page => params[:page], :per_page => 30) 

你可以阅读更多关于from()here。我不确定@store.comments语法是什么意思,所以这可能无法正常工作。