SQL COUNT с предложением WHERE

У меня есть, казалось бы, простой вопрос с SQL, который мне трудно понять. Предположим, у меня есть следующие таблицы:

company: 
    company_id
    company_title

users: 
    user_id
    username

company_owners: 
    company_id
    user_id

Теперь владельцами компании могут быть несколько пользователей. Вот некоторые примеры данных:

company:
1, "A Company"
2, "B Company"
3, "C Company"

users:
1, "A User"
2, "B User"
3, "C User"

company_owners:
1,1
1,2
1,3
2,3

Я пытаюсь создать запрос (MySQL), который получает название компании, а также количество владельцев этой компании на основе конкретного владельца компании. Так, например:

Пример выполнения запроса (на английском языке): Получить количество владельцев для каждой компании, владельцем которой является «Пользователь C»:

company_id=1, company_title="A Company", num_owners=3
company_id=2, company_title="B Company", num_owners=1
company_id=3, company_title="C Company", num_owners=0

Я пытался:

SELECT COUNT(user_id), company.* FROM `company` 
LEFT JOIN `company_owners` ON company_owners.company_id = company.company_id 
WHERE company_owners.user_id=1 GROUP BY company_id

Но это всегда дает мне номер владельца «1», как я предполагаю, потому что он учитывает только строки, где user_id = 1.

У кого-нибудь есть идеи? Я могу предоставить более подробную информацию, если это необходимо.

Огромное спасибо!


person Chris    schedule 02.07.2012    source источник


Ответы (1)


Ваше предложение WHERE должно быть «где существует владелец этой компании с user_id = 1».

SELECT COUNT(user_id), company.*
FROM `company` 
LEFT JOIN `company_owners`
ON company_owners.company_id = company.company_id 
WHERE EXISTS
(
    SELECT *
    FROM company_owners AS co2
    WHERE company_owners.company_id = co2.company_id
    AND co2.user_id = 3
)
GROUP BY company_id

Посмотрите, как это работает онлайн: sqlfiddle

person Mark Byers    schedule 02.07.2012
comment
Это прекрасно работает. Как бы я изменил его, чтобы я также мог получить все компании, у которых нет владельцев? Это возвращает только строки с более чем 0 владельцами. - person Chris; 03.07.2012
comment
@Chris: Он не возвращает компании без владельцев, потому что компания без владельцев не может принадлежать C. - person Mark Byers; 03.07.2012
comment
Это невероятно хороший момент, и я думал о чем-то совершенно другом! Ха-ха, извините. Большое спасибо за быстрый ответ! - person Chris; 03.07.2012