#sql #postgresql #join
Вопрос:
поэтому я пытаюсь объединить этот подзапрос в один столбец подсчетов:
(SELECT count(u.id) FROM companies_company cc FULL JOIN auth_user u on u.company_id = cc.id FULL JOIN auth_user_groups ug ON ug.user_id= u.id FULL JOIN auth_group g ON g.id = ug.group_id WHERE cc.deactivated is null and (email is null) GROUP BY cc.id ORDER BY cc.id)
На этот запрос ниже.
SELECT cc.id , cc.name, (SELECT count(*) from auth_user u where cc.id = u.company_id and (u.email is null)) as number_of_real_users, (SELECT count(u.id) FROM companies_company cc FULL JOIN auth_user u on u.company_id = cc.id FULL JOIN auth_user_groups ug ON ug.user_id= u.id FULL JOIN auth_group g ON g.id = ug.group_id WHERE cc.deactivated is null and (email is null) GROUP BY cc.id ORDER BY cc.id) as number_of_full_users, ss.user_permissions_enabled, cc.company_type, FROM companies_company cc FULL JOIN subscriptions_subscription ss on ss.company_id = cc.id WHERE cc.deactivated is null GROUP BY cc.id, cc.name, ss.user_permissions_enabled ORDER BY cc.id
Но я получаю ошибку «более одной строки, возвращаемой подзапросом, используемым в качестве выражения»… Это неожиданно, так как
(SELECT count(*) from auth_user u where cc.id = u.company_id and (u.email is null)) as number_of_real_users,
есть еще один подзапрос, который я включил, но он отлично работает, так почему бы не добавить этот подзапрос ниже?
(SELECT count(u.id) FROM companies_company cc FULL JOIN auth_user u on u.company_id = cc.id FULL JOIN auth_user_groups ug ON ug.user_id= u.id FULL JOIN auth_group g ON g.id = ug.group_id WHERE cc.deactivated is null and (email is null) GROUP BY cc.id ORDER BY cc.id) as number_of_full_users,
Комментарии:
1. Подзапрос не связан с внешним запросом, поэтому он возвращает несколько строк на строку внешнего запроса. Вы должны указать
companies_company
другой псевдоним в подзапросе (в противном случае, что такоеcc
внутренняя или внешняя таблица?) и добавить что-то вродеWHERE cc2.id = cc.id
. И почему всеFULL JOINS
это ?2. потрясающе, спасибо, приятель, это сработало !!
3. Если кто-то ответит вам в комментарии, попросите его опубликовать его в качестве ответа или опубликовать его в качестве ответа. Но я понимаю, что вы комментировали, что комментарий без ответа был полезен. Можно нажать на стрелку вверх комментария, чтобы согласиться. Но комментарии не являются постоянными. Особенно комментарии «спасибо». Я упомянул о нажатии/принятии ответа просто для того, чтобы убедиться, что вы знали об этом.
Ответ №1:
Потому что вы используете group by в третьей строке запроса, и этот запрос вычисляет количество каждого cc.id
, и, возможно, он возвращает более одной строки
SELECT count(u.id) FROM companies_company cc FULL JOIN auth_user u on u.company_id = cc.id FULL JOIN auth_user_groups ug ON ug.user_id= u.id FULL JOIN auth_group g ON g.id = ug.group_id WHERE cc.deactivated is null and (email is null) GROUP BY cc.id ORDER BY cc.id
Если нет необходимости группировать по и просто нужно подсчитать, удалите группу по и закажите по
Правильный запрос:
SELECT count(u.id) FROM companies_company cc FULL JOIN auth_user u on u.company_id = cc.id FULL JOIN auth_user_groups ug ON ug.user_id= u.id FULL JOIN auth_group g ON g.id = ug.group_id WHERE cc.deactivated is null and (email is null)