PostgreSQL 分组错误

Posted

技术标签:

【中文标题】PostgreSQL 分组错误【英文标题】:PostgreSQL Grouping error 【发布时间】:2013-04-07 10:16:20 【问题描述】:

我在 PostgreSQL 上执行此查询时遇到此错误:

SQLSTATE[42803]:分组错误:7 错误:列“posts.title”必须出现在 GROUP BY 子句中或用于聚合函数 第 1 行:SELECT DISTINCT posts.id, posts.* FROM "posts" GROUP BY "pos..

这是我的查询:

SELECT DISTINCT posts.id, posts.* 
FROM "posts" 
GROUP BY "posts"."id" 
ORDER BY "posts"."id" DESC 
LIMIT 20 OFFSET 0

虽然我用mysql执行它时确实有效,但我该如何解决这个问题?

【问题讨论】:

你为什么使用distinct drop by。这没有任何意义。以及为什么要两次选择 id 列? (一次明确,一次由于* PostgreSQL 版本?如果posts.idPRIMARY KEY,则较新版本的PostgreSQL 通常会执行此操作。也就是说,这是一个完全无意义的查询。 不确定您要达到的目标。如果“id”是主要的,则不需要使用GROUPDISTINCT(正如所指出的,这里是多余的)。 【参考方案1】:

问题是,在 PostgreSQL 中,您需要将您希望在 select 中包含的所有列添加到您的 group by。

所以你的陈述应该是这样的

SELECT * FROM table GROUP BY column1, column2...

【讨论】:

这不是 Postgres 特有的,这是 SQL 标准所要求的。 MySQL对此的草率实现更像是一个错误而不是一个特性。并且 MySQL 应该配置为使用strict_group_by 以避免这种情况。 @a_horse_with_no_name MySQL 与 ANSISTRICT 使用 InnoDB 表几乎是理智的。可惜默认情况下它不会那样发货。 @CraigRinger:我通常推荐ANSI, NO_BACKSLASH_ESCAPES, STRICT_ALL_TABLES, NO_AUTO_VALUE_ON_ZERO, NO_ZERO_DATE, NO_ZERO_IN_DATE, PIPES_AS_CONCAT, ONLY_FULL_GROUP_BY, ERROR_FOR_DIVISION_BY_ZERO 顺便说一句,ArchiFloyd,您的说法并不完全正确:如果包含主键,则允许 RDBMS 假定所有其他列都被隐式包含。较新的 Pg 版本正是这样做的:sqlfiddle.com/#!12/57770/2 这样您就可以运行select *,但随后必须执行group by each,single,column,this,will,never,end,and,is,so,tedious,each,timesometing,changes,Ihaveto,add,anew,entry ????【参考方案2】:

试试这个。

SELECT DISTINCT * FROM 
(SELECT ROW_NUMBER() OVER(PARTITION BY  "posts"."id" ORDER BY   "posts"."id") No, posts.*
 FROM "posts"  ) AS T1 WHERE T1.NO = 1
 ORDER BY "id" DESC LIMIT 20 OFFSET 0

【讨论】:

以上是关于PostgreSQL 分组错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 Windows 功能分组 - Postgresql

PostgreSQL 按总和分组

如何在 PostgreSQL 中对列的一部分进行分组?

PostgreSQL - 按时间戳值分组?

按 PostgreSQL 中的指定列分组

不能用 PostgreSQL 与 eloquent 分组