【问题标题】:column must appear in the GROUP BY clause or be used in an aggregate function [duplicate]列必须出现在 GROUP BY 子句中或在聚合函数中使用 [重复]
【发布时间】:2014-10-26 08:56:10
【问题描述】:

所以我在 postgreSQL(以及其他)中有提交、用户、故事和视图表,如下所示:

submissions
-----------
user_id
story_id
body

views
-----------
user_id
submissions_id

users
-----------
username

我有一个复杂的 SQL 查询查找,它返回的提交按用户是否看过它排序(在 views 表中有一个 user_id 和 submit_id 条目),然后按它有多少视图:

    submissions.find_by_sql("select submissions.*,
          count(views.submission_id) as views_count,
          (select count(*) from views
            where views.user_id=#{user_id} and views.submission_id=submissions.id group by id) as counted
          from submissions
          left outer join views on views.submission_id=submissions.id
          where submissions.story_id = #{id}
          group by submissions.id
          order by counted desc, views_count")

我还希望能够获取每次提交的用户名,这应该很容易:只需在 users.id=submissions.user_id 处加入用户表并将 users.username 添加到选择部分。但是,当我这样做时,我收到一个错误

column "users.username" must appear in the GROUP BY clause or be used in an aggregate function 

这不应该,因为将用户添加到 group by 会删除具有相同用户的多个提交,并且我不需要聚合函数。

由于我显然必须明确说明这一点,我知道还有很多其他问题在问这个问题,但没有一个真正回答我的问题。

【问题讨论】:

  • 几乎是a hundred others
  • 在发布之前,我查看了其中的大约 10 个。他们都处理与我所要求的不同的事情,但他们都没有回答我的问题。
  • 您尝试了哪些标准解决方案,为什么不能让它们发挥作用?
  • 将用户添加到GROUP BY不会删除多个提交。向GROUP BYnever 添加更多项目会删除更多重复项。只有相反的可能。

标签: sql ruby-on-rails postgresql


【解决方案1】:

当你有一个group by 子句时,在大多数系统中你被限制在 仅在您的 select 语句中显示 group by 子句中的字段。加上使用 count(), sum(), 等的任何聚合列

尝试围绕您的原始查询进行另一个查询:

select * from 
(
select top 100 percent 
          submissions.id,
          count(views.submission_id) as views_count,
          (select count(*) from views
            where views.user_id=#{user_id} and views.submission_id=submissions.id group by id) as counted
          from submissions
          left outer join views on views.submission_id=submissions.id
          where submissions.story_id = #{id}
          group by submissions.id
          order by counted desc, views_count
) as InnerQuery
left join submissions on submissions.ID = InnerQuery.ID

【讨论】:

  • 我最终将 users.username 添加到分组依据,这应该已经删除了多个类似用户的帖子,但没有。我不明白为什么 group by 很重要,或者为什么将 users.userrname 添加到它实际上有效。
  • @andrewkostka 您将字段按子句放入组中的顺序有很大的不同。您可以使用与 GROUP BY COL2、COL1 完全不同的 GROUP BY COL1、COL2。始终从左到右查看它,这决定了哪个首先分组,然后是第二个分组....有意义吗?您是否尝试过我发布的完整查询?这应该工作
猜你喜欢
  • 2018-05-16
  • 2013-11-05
  • 2021-06-25
  • 2013-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多