Получить количество строк таблицы, используя объединение нескольких таблиц - PullRequest
1 голос
/ 28 июня 2019

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

company_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

companyuser_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 

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

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

1 Ответ

2 голосов
/ 28 июня 2019

Вы должны объединиться в отдельные подзапросы, которые находят значения в соответствующих таблицах 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;
...