2017-01-17 3 views
1

テーブル内のすべての企業と、それぞれの特定の企業が持つ管理者の数をリストしたいと思います。クエリ内のクエリが「列として返されました」

テーブル:(指定したIDを持つ一つの特定の「会社で「管理者」の数を取得するには

SELECT companies.name 
FROM companies 

companies 
id 
name 
... 

users 
id 
company_id 
... 

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

users_groups 
id 
user_id 
group_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 

どうすればこれらの2つの質問をマージできますか?これは失敗します。

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に含まれるようにフィルタリングしようとしており、結果はすべての企業を表示します。グリブデン – 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であり、すべての 'フィルタリング'があります。( WHERE ). 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 tableグループcompletely from the query. If not, then be sure to have INDEX(名) `そのテーブルインチ

関連する問題