2016-12-30 127 views
0

我遇到了使用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

原因反對票,將不勝感激。 –

回答

5

這是您的查詢:

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'子句是由全局範圍的雄辯添加的;我不是自己手動添加它。 –

0

如果您不能刪除ORDER BY,你能代替添加一個額外的文本字段:

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