Chybová zpráva vám říká:
agregáty nejsou povoleny v klauzuli WHERE
count()
je agregační funkce. K tomu použijte klauzuli HAVING.
Dotaz může vypadat takto:
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
S PostgreSQL 9.1 nebo novějším stačí GROUP BY
primární klíč tabulky (za předpokladu recommendations.id
je PK). Ve verzích Postgres před 9.1 jste museli zahrnout vše sloupců SELECT
seznam, který není agregován v GROUP BY
seznam. S recommendations.*
v SELECT
seznam, to by byl každý jednotlivý sloupec tabulky.
Cituji poznámky k vydání PostgreSQL 9.1:
Povolit jiné než
GROUP BY
sloupce v seznamu cílů dotazu, když je primární klíč zadán vGROUP BY
klauzule (Peter Eisentraut)
Jednodušší s dílčím výběrem
Ať tak či onak, toto je jednodušší a rychlejší a dělá to samé:
SELECT *
FROM recommendations r
WHERE user_id = $current_user_id
AND (SELECT count(*)
FROM approvals
WHERE recommendation_id = r.id) = 1;
Vyhněte se násobení řádků pomocí JOIN
a priori, pak je nemusíte zpětně agregovat.