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

时间:2016-12-30 01:16:04

标签: postgresql

我遇到使用PostgreSQL的PHP​​应用程序的问题。我有一个简单的SQL语句,如下所示:

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

但它会触发以下错误:

  

SQLSTATE [42803]:分组错误:7错误:列" categories.sort_order"必须出现在GROUP BY子句中或用于聚合函数   第1行:... om"类别"其中" promoter_id" =" sort_orde的$ 1订单...   ^(SQL:选择count(*)作为聚合来自"类别"其中" promoter_id" = 7 order by" sort_order" asc)

sort_order列包含用于“排序”记录的任意无符号整数。

上述语句由Eloquent(Laravel的ORM)发布,似乎只是计算带有WHERE子句的表中的记录,为什么会触发此错误?我真的不想将sort order列分组,以防有重复值(即sort_order值为2的两个记录)但这似乎是解决方案的错误消息是建议。

有替代解决方案吗?我对PostgreSQL很陌生,所以这似乎是我迄今为止没有遇到MySQL的特点。

2 个答案:

答案 0 :(得分:5)

这是您的查询:

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

order by在做什么?当结果集有一行时,为什么还要打扰排序。把它留下来吧。

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

答案 1 :(得分:0)

如果你不能删除ORDER BY,你可以改为添加一个额外的文字字段:

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