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 BYsloupce v seznamu cílů dotazu, když je primární klíč zadán vGROUP BYklauzule (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.