Ruby on rails 按关联计数:“AS”处或附近出现语法错误

Ruby on rails 按关联计数:“AS”处或附近出现语法错误,ruby-on-rails,postgresql,activerecord,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)

我想按一个演员的出场次数来订购一组电视节目。我接着问了一些其他的堆栈溢出问题,问了同样的问题,但是我得到了一个错误,我没有看到任何地方提到过

 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:第1行或附近的语法错误:选择 COUNTshow.*,COUNTcontributions.id作为来宾公司

输出:

: 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))

这就是我一直关注的堆栈溢出:

看起来arel没有正确设置SQL语句。尝试在选择中反转条件

.select('COUNT(contributions.id) AS guest_count, show.*')
也许这会帮助阿雷尔摆脱困境

编辑:

你还有第二个问题。您正在尝试使用聚合函数,但未指明要按哪些列进行分组。使用聚合时,不要使用show.*而是列出要选择的列。之后,使用group方法列出列,以便可以将它们包括在聚合查询中

编辑2:

你能不能用这样的方法:

shows = Show.includes(:contributions).all
并通过以下方式访问计数:

shows.first.contributions.count
或者这是您正在优化的性能问题?

您必须将放映表更改为放映:


原始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;
这包括没有人物出现的表演,但要注意最后的排序。要排除这些显示,请使用联接而不是左联接

考虑:


你能发布sql解释的结果吗?好主意,谢谢提醒!你不会从中得到解释结果,因为这是一个语法错误。对于像《权力的游戏》这样的节目,我想要一个最常出现的角色表,按他们出现的次数排列,在本例中是一个“贡献”。您关于颠倒将计数放在首位的顺序的提示修复了从rails 3.2升级后我的问题。相同错误:PG::SyntaxError:错误:语法错误位于或接近第1行:选择COUNTshow.*,COUNTcontributions.id作为guest\u co…^:在42中选择COUNTshow.*,COUNTcontributions.id作为guest_count(在剧集上显示内部加入剧集)。show_id=show.id在剧集上显示内部加入剧集。剧集_id=剧集。id其中contributions.role_id=2和contributions.person_id:根据您的错误,您没有在选择查询中将您的剧集更改为剧集。再试一次我想是的。我刚刚在重新启动后再次尝试,但出现了另一个错误:PG::GroupingError:错误:column shows.id必须出现在GROUP BY子句中,或用于聚合函数行1:SELECT shows.*,COUNTcontributions.id AS guest_count FR.^:选择shows.*,COUNTcontributions.id作为guest\u count,从中按42顺序按guest\u count描述选择shows\u id=shows.id内部加入贡献。Spidence\u id=Spidents.id其中contributions.role\u id=2和contributions.person\u id。我想,博士后需要分组来计算你的客人人数。我稍后会更新它。
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;