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