2016-12-30 9 views
0

私はPostgreSQLを使ってPHPアプリケーションに問題があります。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列が「ソート」の記録に使用されている任意の、符号なし整数が含まれています私はこのようになります簡単なSQL文を持っています。

上記の文はEloquent(LaravelのORM)によって発行され、WHERE句のあるテーブルのレコードを数えているようですが、なぜこのエラーがトリガーされますか?重複する値(sort_orderの値を持つ2つのレコード)がある場合には列をグループ化することは実際には望ましくありませんが、エラーメッセージが示唆している解決策であるようです。

代替ソリューションはありますか?私はPostgreSQLについて非常に新しくなっているので、これは私が今までMySQLに直面していなかったという特殊性のようです。

+0

理由をいただければ幸いです。 –

答えて

5

これはあなたのクエリです:

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

order byが何をしているのか?なぜ結果セットに1つの行がある場合は、順序付けに気をつけますか?ちょうどそれを残す。

エラーが発生する具体的な理由は、列sort_orderが結果セットにないため、Postgresが解決できないためです。 MySQLは集約処理の方がはるかに柔軟性があり(誤っている)、他のデータベースでエラーが発生するような構造体(例えばなど)を許可します。

+0

'order by'節は、Eloquentグローバルスコープによって追加されました。私は手動でそれを自分で追加していません。 –

0

あなたの代わりに余分なリテラル・フィールドを追加することができますが、ORDER BYを削除することができない場合:ダウン投票

SELECT count(*) AS aggregate, 0 AS sort_order 
FROM "categories" 
WHERE "promoter_id" = ? 
ORDER BY "sort_order" asc; 
関連する問題