Ruby on rails GroupingError:ERROR:column"&引用;必须出现在GROUP BY子句中或在聚合函数中使用

Ruby on rails GroupingError:ERROR:column"&引用;必须出现在GROUP BY子句中或在聚合函数中使用,ruby-on-rails,ruby,postgresql,heroku,group-by,Ruby On Rails,Ruby,Postgresql,Heroku,Group By,我正在尝试创建一个独特的患者名单,他们留下了评论。这些代码在我上传到heroku之前都很好,但在postgresql中它不起作用 这是我创建列表的Ruby.erb代码: <% @comments.group(:patient_id).each_with_index do |comment, index| %> <div class="profile-post color-one"> <span class="profile-post-numb"

我正在尝试创建一个独特的患者名单,他们留下了评论。这些代码在我上传到heroku之前都很好,但在postgresql中它不起作用

这是我创建列表的Ruby.erb代码:

<% @comments.group(:patient_id).each_with_index do |comment, index| %>
    <div class="profile-post color-one">
       <span class="profile-post-numb"><%= index+1 %></span>
        <div class="profile-post-in">
            <h3 class="heading-xs"><a><%= link_to "#{comment.patient.first_name} #{comment.patient.last_name}", comment_path(comment) %></a></h3>
            <p>Lastest comment from <%= time_ago_in_words(comment.created_at) %> ago<i class="pull-right"><%= link_to "Edit", edit_comment_path(comment) %> <%= link_to "Delete", comment_path(comment), method: :delete, data: {confirm: 'Are you sure you want to delete'} %></i></p>
        </div>
    </div>
<% end %>
heroku日志将此作为错误消息提供给我:

我尝试了其他问题的解决方案,例如。这表示我应该将字段comments.id添加到我的组子句中:

<% @comments.group(:patient_id, :"comments.id").each_with_index do |comment, index| %>
这会在本地产生此错误:

SQLite3::SQLException:没有这样的函数:子字符串:选择 “注释”。*来自“注释”中的“注释”。“临床医生id”=?命令 按子字符串(创建于,1.8)描述


我意识到这是一个常见的问题,我对SQL缺乏经验,所以我很难获得代码,这样它就可以在我的开发和生产环境中工作。我读到的答案不是用Ruby来获取SQL,也不是我的经验水平。

你不能在Postgres中将
SELECT*
groupbysomecolumn
结合起来(除非
somecolumn
是PK),因为这是一个矛盾。所有非聚合列(在聚合函数外部的
SELECT
HAVING
ORDER BY
子句中使用)必须在
GROUP BY
列表中-主键列可以替换表中的所有列。否则,将无法定义从聚合集中选择哪个值

如果存在
分组依据
或存在任何聚合函数,则 对于要引用未分组的
选择
列表表达式无效
列,聚合函数内或未分组的列
在功能上取决于分组的列,因为
否则,将为未分组的对象返回多个可能的值
专栏。如果分组列(或
其中的子集)是包含
未分组列

已知其他某个RDBMS在这里玩肮脏的把戏,允许这样做并拾取任意值

您似乎想要一个有评论的独特患者列表,每个患者都有最新的评论。Postgres中最简单的方法是使用
DISTINCT ON

SELECT DISTINCT ON (patient_id) *
FROM   comments
WHERE  clinician_id = $1
ORDER  BY patient_id, created_at DESC NULLS LAST;
但是SQLite无法实现这一点,因为SQLite不应该首先出现在循环中:

NULLS LAST
仅当在
处创建的
可以为空时才相关:

有关
上不同的
的详细信息:

SELECT DISTINCT ON (patient_id) *
FROM   comments
WHERE  clinician_id = $1
ORDER  BY patient_id, created_at DESC NULLS LAST;

错误告诉您,您试图做的事情无法通过这种方式完成。在该查询中,每个不同的患者id只返回一行。可能有多个具有该患者id的注释行。假设有10个注释具有相同的患者id-若我们选择了一列(例如它的id),我们不根据该列进行分组,该值应来自10行中的哪一行?这是不明确的,所以SQL不允许您这样做。您只能使用正在分组的列或聚合分组行的函数的输出,如COUNT或SUM。感谢Erwin,这是一个非常有用的答案。我已切换到本地使用PostreSQL,
DISTINCT ON
为我提供了一个独特患者列表:
@comments.order(“患者id,在描述时创建”)。select('ON(患者id)*')。uniq.each_和_indexdo | comment,索引|
患者现在按照我的
seed.rb
文件中创建的顺序进行排序,也就是按照创建顺序进行排序。您有没有建议如何按照他们最新评论的
创建的
对他们进行排序?@Skiapex:将此查询包装成一个外部查询,并使用不同的
排序依据
。以下是详细说明:
@comments = current_clinician.comments.order("substring(created_at,1.8) desc")
SELECT DISTINCT ON (patient_id) *
FROM   comments
WHERE  clinician_id = $1
ORDER  BY patient_id, created_at DESC NULLS LAST;