PostgreSQL:列必须出现在GROUP BY子句中或用于聚合函数中

问题描述:

我遇到了使用PostgreSQL的PHP​​应用程序的问题。我有一个简单的SQL语句,看起来像这样:PostgreSQL:列必须出现在GROUP BY子句中或用于聚合函数中

select count(*) as aggregate from "categories" where "promoter_id" = ? order by "sort_order" asc 

但它触发以下错误:

SQLSTATE[42803]: Grouping error: 7 ERROR: column "categories.sort_order" must appear in the GROUP BY clause or be used in an aggregate function LINE 1: ...om "categories" where "promoter_id" = $1 order by "sort_orde... ^(SQL: select count(*) as aggregate from "categories" where "promoter_id" = 7 order by "sort_order" asc)

sort_order列包含了用于“排序”记录随心所欲,无符号整数。

上面的语句是由Eloquent(Laravel的ORM)发出的,似乎只是用WHERE子句计算表中的记录,那么为什么会触发这个错误?如果存在重复值(即sort_order值为2的值为两个记录),但我认为并不真正需要对sort order列进行分组,但似乎是错误消息是建议的解决方案。

是否有替代解决方案?我对PostgreSQL相当陌生,所以这似乎是我迄今为止还没有面对过MySQL的一个特点。

+0

原因反对票,将不胜感激。 –

这是您的查询:

select count(*) as aggregate 
from "categories" 
where "promoter_id" = ? 
order by "sort_order" asc; 

什么order by在做什么?当结果集有一行时,为什么要进行排序呢?只是把它留下。

错误发生的具体原因是因为列sort_order不在结果集中,所以Postgres无法解析它。 MySQL在处理聚合方面更灵活(而且不正确),所以它允许构造(如order by),这会导致任何其他数据库中的错误。

+0

'order by'子句是由全局范围的雄辩添加的;我不是自己手动添加它。 –

如果您不能删除ORDER BY,你能代替添加一个额外的文本字段:

SELECT count(*) AS aggregate, 0 AS sort_order 
FROM "categories" 
WHERE "promoter_id" = ? 
ORDER BY "sort_order" asc;