按关联计数:语法错误在或附近" AS"

时间:2015-09-19 04:18:35

标签: ruby-on-rails postgresql activerecord

我试图按照演员的次数来订购一组电视节目。我跟着其他一些堆栈溢出问题提出同样的问题,但我收到的错误是我在任何地方都没有看到过。

 Show.joins(:contributions)
  .select('show.*, COUNT(contributions.id) AS guest_count')
  .where('contributions.role_id = 2')
  .where('contributions.person_id IN (?)', self.id)
  .order('guest_count desc')
  

PG :: SyntaxError:ERROR:语法错误在或附近" AS"第1行:选择   COUNT(显示。*,COUNT(contributions.id)AS guest_co ...

输出:

: SELECT COUNT(COUNT(contributions.id) AS guest_count, show.*) FROM
"show" INNER JOIN "episodes" ON "episodes"."show" = "show"."id" 
INNER JOIN "contributions" ON "contributions"."episode_id" = 
"episodes"."id" WHERE (contributions.role_id = 2) AND 
(contributions.person_id IN (42))

这是我一直关注的堆栈溢出:Rails 3 ActiveRecord: Order by count on association

3 个答案:

答案 0 :(得分:1)

看起来似乎没有正确设置您的SQL语句。尝试颠倒选择中的条件。

.select('COUNT(contributions.id) AS guest_count, show.*')

也许这会有所帮助。

编辑:

你还有第二个问题。您尝试使用汇总功能,但未指明要分组的列。使用汇总时,请不要使用show.*,而是列出要选择的列。之后,使用group方法列出列,以便它们可以包含在聚合查询中。

编辑2:

你可以使用类似的东西:

shows = Show.includes(:contributions).all

并使用以下方式访问计数:

shows.first.contributions.count

或者这是您正在优化的性能问题?

答案 1 :(得分:0)

原始SQL可能如下所示:

SELECT s.*, x.ct
FROM   shows s
LEFT JOIN (
   SELECT e.show, count(*) AS ct
   FROM   episodes e
   JOIN   contributions c ON e.id = c.episode_id
   WHERE  c.role_id = 2
   AND    c.person_id = ?  -- self.id
   GROUP  BY 1
   ) x ON s.id = x.show
ORDER  BY x.ct DESC NULLS LAST;

这包括没有任何人出现的节目,但要小心排序。要排除这些节目,请使用JOIN代替LEFT JOIN

考虑:

答案 2 :(得分:-1)

您必须将app.get('/*',表格更改为show

shows