2017-01-17 22 views
1

我喜歡列出表中的所有公司以及每個特定公司具有的管理員數量。查詢返回內部查詢「作爲列」

的表格:

companies 
id 
name 
... 

users 
id 
company_id 
... 

groups ('id' = 1 has 'name' = admin) 
id 
name 

users_groups 
id 
user_id 
group_id 

要列出所有「公司」我寫這篇文章:

SELECT companies.name 
FROM companies 

爲了得到一個具體的「公司」管理'(的數量與給定的ID )我寫這篇

SELECT COUNT (users.id) 
FROM users, companies, users_groups WHERE 
users.company_id = companies.id AND 
users_groups.user_id = users.id AND 
users_groups.group_id = 1 

所以,我怎麼能合併這兩個問題?這種失敗:

SELECT 
    companies.name, 
    (
     SELECT COUNT (users.id) 
     FROM users, companies, users_groups WHERE 
     users.company_id = companies.id AND 
     users_groups.user_id = users.id AND 
     users_groups.group_id = 1 
    ) 
    as admins_in_company 
FROM users, companies, users_groups 

回答

1

使用顯式連接語法和計數(不同的...):

select c.name, count(distinct u.id) 
from companies c 
inner join users u 
    on u.company_id = c.id 
inner join users_groups ug 
    on ug.user_id = u.id 
where ug.group_id = 1 
group by c.name 

所有企業:

select c.name, count(distinct u.id) 
from companies c 
left join users u 
    on u.company_id = c.id 
left join users_groups ug 
    on ug.user_id = u.id 
    and ug.group_id = 1 
group by c.name 
+0

謝謝!你有任何想法如何編寫查詢,以便它將返回所有公司(也沒有管理員)。我嘗試用'左連接'替換'內連接',但並不縫合來實現這個訣竅。 – user3104427

+0

@ user3104427查看更新 – JohnHC

+0

再次感謝!現在我正在嘗試進行過濾,以便只有具有users.active = 1的管理員纔會包含在COUNT中,並且再次顯示所有公司的結果。 grisbukten – user3104427

0
SELECT c.name, COUNT(DISTINCT u.id) AS num_admins 
    FROM groups AS g 
    JOIN users_groups AS ug ON ug.group_id = g.id 
    JOIN users AS u   ON u.id = ug.user_id 
    JOIN companies AS c  ON c.id = u.company_id 
    WHERE g.group_id = 1 
     AND g.name = 'admin' 
    GROUP BY u.company_id; 

目前還不清楚是否你需要COUNT(DISTINCT u.id)或簡單地COUNT(*)

我按照他們將要查看的順序列出了4個表格。 (這不是要求,但使用戶更容易閱讀並仔細思考)首先是groups其中包含所有'過濾(其中). Then it moves through the other tables all the way to getting the company.name . Then the GROUP BY and its COUNT(DISTINCT ...)`是應用。

技巧上多比多模式(users_groups)設計:http://mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table

groups - GROUP_ID and group.name are in a 1:1 relationship, yes? If you know that it is GROUP_ID = 1個, you can get rid of the tablecompletely from the query. If not, then be sure to have INDEX(名稱),在該表'。