PostgreSQL分组错误
我在PostgreSQL上执行此查询时出错: SQLSTATE[42803]: Grouping error: 7 ERROR: column "posts.title" must appear in the GROUP BY clause or be used in an aggregate function LINE 1: SELECT DISTINCT posts.id, posts.* FROM "posts" GROUP BY "pos..PostgreSQL分组错误,sql,postgresql,laravel,Sql,Postgresql,Laravel,我在PostgreSQL上执行此查询时出错: SQLSTATE[42803]: Grouping error: 7 ERROR: column "posts.title" must appear in the GROUP BY clause or be used in an aggregate function LINE 1: SELECT DISTINCT posts.id, posts.* FROM "posts" GROUP BY "pos.. 虽然在我使用mysql执行时它确实起了作用
虽然在我使用mysql执行时它确实起了作用,但我如何解决这个问题呢?问题是,在PostgreSQL中,您需要将希望在select中包含的所有列添加到组中 所以你的陈述应该是
SELECT * FROM table GROUP BY column1, column2...
试试这个
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
这不是Postgres特有的,这是SQL标准所要求的。MySQL的草率实现更像是一个bug,而不是一个特性。而MySQL应该配置为使用
strict\u group\u by
来避免这种情况。@a\u horse\u没有名称MySQL withANSI
和strict
使用InnoDB表几乎是明智的。遗憾的是,它在默认情况下不是这样发布的。@CraigRinger:我通常推荐ANSI,不使用反斜杠转义,严格的所有表格,不使用自动值,不使用零日期,不使用零日期,管道使用CONCAT,只使用完整分组,错误使用零除法
BTW,ArchiFloyd,您的陈述并非严格正确:如果包含主键,则允许RDBMS假定隐式包含所有其他COL。较新的Pg版本正是这样做的:因此您可以运行select*
,但必须按每个分组,单个,列,这,将,永远,结束,并且,是,所以,乏味,每个,计时,更改,Ihaveto,add,New,entry
?为什么要使用distinct
和DULOP by。这没有任何意义。为什么要选择id列两次?(一次是明确的,一次是由于*
)PostgreSQL版本?如果posts.id
是主键,则较新版本的PostgreSQL通常会执行此罚款。也就是说,这是一个完全荒谬的问题。不确定你想要达到什么目的。如果“id”是主要的,您就不需要使用组
或不同的
(正如所指出的,这里是多余的)。
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