Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL分组错误_Sql_Postgresql_Laravel - Fatal编程技术网

PostgreSQL分组错误

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执行时它确实起了作用

我在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执行时它确实起了作用,但我如何解决这个问题呢?

问题是,在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 with
ANSI
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