エラーメッセージは次のことを示しています:
WHERE句で許可されていない集計
count()
集計関数です。そのためにHAVING句を使用します。
クエリは次のようになります:
SELECT r.*
FROM recommendations r
JOIN approvals a ON a.recommendation_id = r.id
WHERE r.user_id = $current_user_id
GROUP BY r.id
HAVING count(a.recommendation_id) = 1
PostgreSQL 9.1以降では、GROUP BY
で十分です。 主キー テーブルの(recommendations.id
を想定) は PK)。 9.1より前のPostgresバージョンでは、すべてを含める必要がありました。 SELECT
の列 GROUP BY
に集約されていないリスト リスト。 recommendations.*
を使用 SELECT
で リスト、それはテーブルのすべての列になります。
PostgreSQL 9.1のリリースノートを引用します:
GROUP BY
以外を許可するGROUP BY
で主キーが指定されている場合のクエリターゲットリストの列 条項(Peter Eisentraut)
サブセレクトでシンプル
いずれにせよ、これはより簡単で高速で、同じことを行います:
SELECT *
FROM recommendations r
WHERE user_id = $current_user_id
AND (SELECT count(*)
FROM approvals
WHERE recommendation_id = r.id) = 1;
JOIN
で行を乗算することは避けてください 事前に、それらを集約して戻す必要はありません。