2012-07-02 50 views
6

Tengo una pregunta bastante simple con SQL que tengo problemas para descubrir. Supongamos que tengo las siguientes tablas:SQL COUNT con WHERE cláusula

company: 
    company_id 
    company_title 

users: 
    user_id 
    username 

company_owners: 
    company_id 
    user_id 

Ahora, puede haber varios usuarios como propietarios de la empresa. He aquí algunos datos de ejemplo:

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 

Estoy tratando de crear una consulta (MySQL) que obtiene el COMPANY_TITLE, así como el número de propietarios de esa empresa, basado en propietario de una empresa específica. Así, por ejemplo:

Ejemplo de consulta (en Inglés) lo siguiente: Obtener número de propietarios de cada empresa que "Usuario C" es un propietario para:

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 

que he intentado:

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 

Pero eso siempre me da un número de propiedad de "1", supongo porque solo CUENTA las filas donde user_id = 1.

¿Alguien tiene alguna idea? Puedo proporcionar más detalles si es necesario.

¡Muchas gracias!

+0

¿Cuál es 'course_id'? –

+0

Lo siento, fue un error – Chris

Respuesta

7

Su cláusula WHERE debe ser "donde exista un propietario para esta empresa con 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 

ver su funcionamiento en línea: sqlfiddle

+0

Eso funciona genial. ¿Cómo lo cambiaría para que también pueda obtener todas las compañías que tienen 0 propietarios? Esto solo devuelve las filas con más de 0 propietarios. – Chris

+0

@Chris: No devuelve compañías sin propietarios porque una empresa sin propietarios no puede ser propiedad de "C". –

+0

¡Es un punto increíblemente bueno y estaba pensando en algo totalmente diferente! Jaja lo siento. ¡Muchas gracias por la respuesta rápida! – Chris

1
select company.company_id, company_title, count(*) 
from company join company_owners on company.company_id = company_owners.company_id 
where exists (select 1 from company_owners co where co.user_id = 1 and co.company_id = company.company_id) 
group by company.company_id, company_title 
Cuestiones relacionadas