Съобщението за грешка ви казва:
агрегати не са разрешени в клауза 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, тогава не е нужно да ги агрегирате обратно.