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的一个特点。
这是您的查询:
select count(*) as aggregate
from "categories"
where "promoter_id" = ?
order by "sort_order" asc;
什么order by
在做什么?当结果集有一行时,为什么要进行排序呢?只是把它留下。
错误发生的具体原因是因为列sort_order
不在结果集中,所以Postgres无法解析它。 MySQL在处理聚合方面更灵活(而且不正确),所以它允许构造(如order by
),这会导致任何其他数据库中的错误。
'order by'子句是由全局范围的雄辩添加的;我不是自己手动添加它。 –
如果您不能删除ORDER BY,你能代替添加一个额外的文本字段:
SELECT count(*) AS aggregate, 0 AS sort_order
FROM "categories"
WHERE "promoter_id" = ?
ORDER BY "sort_order" asc;
原因反对票,将不胜感激。 –