2011-03-16 23 views
8

que estoy tratando de contar el número de empresas que tienen al menos un producto de la siguiente consultaMySQL seleccionar la cuenta

SELECT count(*) 
FROM company c 
JOIN product p on c.id = product.company_id 
WHERE p.is_deleted = 0 
AND c.is_customer = 1 
AND c.company_type_id = 5 
GROUP by c.id 

lo tanto, esto me muestra una lista de todas las empresas, y el recuento de los productos para cada empresa.

Lo que estoy tratando de lograr es un recuento de empresas del resultado anterior.

Esto se puede lograr de la siguiente manera:

SELECT count(*) 
FROM ( 
    SELECT count(*) 
    FROM company c 
    JOIN product p on c.id = product.company_id 
    WHERE p.is_deleted = 0 
    AND c.is_customer = 1 
    and c.company_type_id = 5 
    GROUP by c.id) AS t1 

lo tanto, esto me da el resultado correcto, pero sólo me pregunto si hay una manera más eficiente de hacer las cosas.

+0

Parece que usted ha hecho un buen trabajo aquí. No veo la posibilidad de mejorar a menos que realmente sufras problemas de rendimiento. – BigFatBaby

+0

¡Seguramente la consulta anterior siempre devolverá 1? Usted tiene un 'COUNT (*)' que devuelve un solo campo, luego 'SELECT COUNT (*)' nuevamente para un solo campo ... ¿Me falta algo? – anothershrubery

+0

@another: el conteo interno (*) tiene un 'group by' - devuelve un conteo por compañía – Blorgbeard

Respuesta

9

Creo que se puede simplificar a esto:

SELECT count(distinct c.id) 
FROM company c 
JOIN product p on c.id = product.company_id 
WHERE p.is_deleted = 0 
AND c.is_customer = 1 
AND c.company_type_id = 5 
+0

¿No estás contando las distintas compañías aquí? No los productos distintos por compañía? – anothershrubery

+0

@another Creo que eso es lo que la pregunta está pidiendo: cantidad de empresas con al menos un producto. – Blorgbeard

+0

@anothershrubery: la consulta contará cuántos identificadores únicos de la compañía hay en el resultado, y el resultado se filtrará solo a las compañías que tienen al menos un producto. muy buen trabajo @Blorgbeard - estoy corregido – BigFatBaby