Получить количество строк таблицы, используя объединение нескольких таблиц

У меня есть три таблицы company_m, client_m, companyuser_m

компания_m

 CompanyID  CompName    
----------+-----------
     7        Comp3 
     8        Comp2 
     9        Comp1 
     10       Company 
     11       Company4

client_m

clid    AttachToCompanyID   clname
-----+--------------------+------
  1           7             client1
  2           7             client2
  6           8             client3

компанияuser_m

uid CompanyID   uname
---+---------+-------
 1    7         user1
 2    10        user2

Моя цель

Мне нужно подсчитать всех клиентов и пользователей соответствующей компании

Ожидаемый результат

CompanyID   CompName    clientcount usercount
---------+-----------+--------------+--------
   7        Comp3          2           1
   8        Comp2          1           0
   9        Comp1          0           0
  10        Company 3      0           1
  11        Company4       0           0

Мой код

select company_m.CompanyID,company_m.CompName,
count(client_m.AttachToCompanyID) as clientcount ,
count(companyuser_m.CompanyID) as usercount from company_m
left join client_m on client_m.AttachToCompanyID=company_m.CompanyID
left join companyuser_m on companyuser_m.CompanyID=company_m.CompanyID
group by company_m.CompanyID 

Но приведенный выше код не дает правильного вывода.

проверьте мою скрипку


person JIJOMON K.A    schedule 28.06.2019    source источник


Ответы (1)


Вы должны присоединиться к отдельным подзапросам, которые находят счетчики в соответствующих таблицах client_m и companyuser_m:

SELECT
    t1.CompanyID,
    t1.CompName,
    COALESCE(t2.cnt, 0) AS client_count,
    COALESCE(t3.cnt, 0) AS user_count
FROM company_m t1
LEFT JOIN
(
    SELECT AttachToCompanyID, COUNT(*) AS cnt
    FROM client_m
    GROUP BY AttachToCompanyID
) t2
    ON t1.CompanyID = t2.AttachToCompanyID
LEFT JOIN
(
    SELECT CompanyID, COUNT(*) AS cnt
    FROM companyuser_m
    GROUP BY CompanyID
) t3
    ON t1.CompanyID = t3.CompanyID;
person Tim Biegeleisen    schedule 28.06.2019