我遇到使用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的特点。
答案 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;