加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 将表列添加到Group by子句 – Ruby on Rails

发布时间:2020-12-17 03:11:49 所属栏目:百科 来源:网络整理
导读:我正在尝试使用Heroku,显然 Postgresql比聚合函数的SQL要严格得多.当我向Heroku推送时,我收到一个错误,说明如下. On another question我问我收到了一些指导,说我应该将列添加到我的group by子句中,我不知道该怎么做.请参阅下面的完整错误和PostsControll#ind
我正在尝试使用Heroku,显然 Postgresql比聚合函数的SQL要严格得多.当我向Heroku推送时,我收到一个错误,说明如下.

On another question我问我收到了一些指导,说我应该将列添加到我的group by子句中,我不知道该怎么做.请参阅下面的完整错误和PostsControll#index.

SELECT posts.*,count(*) as vote_total FROM "posts"   INNER JOIN "votes" ON votes.post_id = posts.id   GROUP BY votes.post_id ORDER BY created_at DESC LIMIT 5 OFFSET 0):

PostsController

def index
    @tag_counts = Tag.count(:group => :tag_name,:order => 'count_all DESC',:limit => 20)
       conditions,joins = {},:votes

    @ugtag_counts = Ugtag.count(:group => :ugctag_name,:votes

    @vote_counts = Vote.count(:group => :post_title,:limit => 20)
          conditions,:votes


       unless(params[:tag_name] || "").empty?
         conditions = ["tags.tag_name = ? ",params[:tag_name]]
         joins = [:tags,:votes]
       end
       @posts=Post.paginate(
                 :select => "posts.*,count(*) as vote_total",:joins => joins,:conditions=> conditions,:group => "votes.post_id",:order => "created_at DESC",:page => params[:page],:per_page => 5)
        @popular_posts=Post.paginate(
                 :select => "posts.*,:order => "vote_total DESC",:per_page => 3)

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @posts }
      format.json { render :json => @posts }
      format.atom
    end
  end

解决方法

MySQL和SQLite非常灵活,它们允许select-list中的列而不在GROUP BY子句中命名(而不是在COUNT()之类的聚合函数中).但是这种灵活性会导致模糊的查询.

PostgreSQL仅与ANSI SQL标准一样严格.我测试过的所有其他数据库(Oracle,Microsoft,IBM DB2,Firebird)在这个问题上的行为与PostgreSQL类似.

您需要做的是使选择列表中的posts列列表与GROUP BY子句中指定的列匹配.通过选择较少的列或通过向列添加列来执行此操作.

我不是Rails专家,我找不到如何将多个列作为参数传递给:group的示例.查看active_record / base.rb的代码,看起来它只是将选项值复制到文字SQL GROUP BY子句中.所以我认为(没有尝试过)你可以这样做:

...
:group => "posts.post_id,posts.foo,posts.bar,posts.baz",...

请注意,您必须为选择列表中不属于聚合函数的每个列命名.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读