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.id
是PRIMARY KEY
,则较新版本的PostgreSQL 通常会执行此操作。也就是说,这是一个完全无意义的查询。
不确定您要达到的目标。如果“id”是主要的,则不需要使用GROUP
或DISTINCT
(正如所指出的,这里是多余的)。
【参考方案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 与 ANSI
和 STRICT
使用 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 分组错误的主要内容,如果未能解决你的问题,请参考以下文章