Съобщението за грешка ви казва:
агрегати не са разрешени в клауза 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 е ПК). Във версиите на Postgres преди 9.1 трябваше да включите всички колони на 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 a priori, тогава не е нужно да ги агрегирате обратно.