我正在使用Rails 4.2并设置了impressionist gem,它可以很好地记录页面展示次数。
我正在努力做与this Stackoverflow post完全相同的事情,但答案是不行的。我试过了:
start_time = 30.days.ago
@mostReadAlbums30Days = Album.joins(:impressions).where("impressions.created_at<='#{Time.now}' and impressions.created_at >= '#{start_time}'").group("impressions.impressionable_id").order("count(impressions.id) DESC")
这会产生以下SQL和错误消息
PG :: UndefinedTable:错误:缺少表的FROM子句条目 &#34;印象S&#34;第1行:... BY impressions.impressionable_id ORDER BY 计数(印象...
^:SELECT&#34;专辑&#34;。* FROM&#34;专辑&#34; INNER JOIN&#34;印象&#34;上 &#34;曝光&#34;&#34; impressionable_id&#34; =&#34;专辑&#34;。&#34; id&#34;和 #&34;曝光&#34;&#34; impressionable_type&#34; = $ 1 WHERE (impressions.created_at&lt; =&#39; 2015-01-02 00:50:18 -0200&#39;和 impressions.created_at&gt; =&#39; 2014-12-03 02:50:18 UTC&#39;)GROUP BY impressions.impressionable_id ORDER BY count(impression s.id)DESC
我正在使用Postgresql v9.3.5.2。如何才能使此查询生效?
答案 0 :(得分:1)
主要问题(每条评论):
您的查询中存在一个微妙的拼写错误。它在ORDER BY count(impressions.id)
的n和s之间包含Unicode字符ZERO WIDTH SPACE (U+200B)。看看impressions
在呈现错误消息时如何被破坏,否则就不会发生。
GROUP BY
问题:
由于查询选择albums.*
,因此必须GROUP BY albums.id
而不是GROUP BY impressions.impressionable_id
(假设albums.id
是主键)。这在数值上是等价的,因为无论如何这些表都是通过这两个字段等价连接的,但是看起来,这个上下文中的SQL引擎无法自己解决这个等价。