这似乎比它应该更难:
我希望能够通过它的copy_count对表进行排序,然后只选择具有唯一标题的事件,并将该查询限制为前99个。
Event.order("copy_count DESC").select("DISTINCT ON (events.title) *").limit(99)
这会引发错误:
ActiveRecord::StatementInvalid: PG::Error: ERROR: SELECT DISTINCT ON expressions must match initial ORDER BY expressions
哪个建议我需要将copy_count添加到DISTINCT ON,但这也只会撤回可能相同的唯一copy_count记录!
注意:copy_count的顺序必须先发生。
由于
答案 0 :(得分:10)
对于纯SQL,它看起来像:
SELECT *
FROM (SELECT DISTINCT ON (events.title) *
FROM events
ORDER BY events.title, events.copy_count DESC) top_titles
ORDER BY events.copy_count DESC
LIMIT 99
但我不知道,如何用RoR写它。
答案 1 :(得分:4)
试试这个:
Event.select("DISTINCT ON (events.title) *").order("events.title, copy_count DESC").limit(99)
这是因为当您使用语句DISTINCT ON时,必须在ORDER BY表达式中使用其表达式(例如events.title)
SQL ERROR: SELECT DISTINCT ON expressions must match initial ORDER BY expressions
因此,您只需要在订单声明中的events.title之后添加copy_count列
答案 2 :(得分:3)
试试这个:
Event.order("copy_count DESC").limit(99).select(:title).uniq
答案 3 :(得分:3)
这意味着ORDER BY需要是“events.title,copy_count DESC”。 DISTINCT ON要求您排序的第一件事是DISTINCT列。如果您尝试获得每个标题的最高结果,则必须先将它们分组为具有相同标题的行集,然后才能按copy_count进行排序。如果那不是你想要做的,那么DISTINCT ON就不是正确的结构。