2011-12-07 20 views
5

Deseo recibir el nombre de la propiedad y el recuento de unidades y recuentos. Tengo esta consulta:Doble AJUSTE IZQUIERDO

SELECT 
    `property`.`property_name`, 
    COUNT(unit_id) AS `units_count`, 
    COUNT(special_id) AS `specials_count` 
FROM `property` 
    LEFT JOIN `property_unit` ON unit_property_id = property_id 
    LEFT JOIN `property_special` ON special_property_id = property_id 
WHERE (property_id = '1') 
GROUP BY `property_id` 
ORDER BY `property_name` ASC 

Pero no está funcionando correctamente. Si tengo uno de estos izquierda se une - que está bien, pero si tengo dos, puedo obtener este resultado:

["property_name"] => string(11) "Rivers Edge" 
["units_count"] => string(1) "2" 
["specials_count"] => string(1) "2" 

Especiales recuento es 2 y units_count es 2, pero las unidades de conteo es realmente '1'. ¿Cómo puedo obtener los conteos correctos?

PD: Para aquellos que conocen Zend Framework:

$select->setIntegrityCheck(FALSE) 
    ->from(
     'property', 
     array(
      'property_name', 
     ) 
    ) 
    ->joinLeft(
     'property_unit', 
     'unit_property_id = property_id', 
     array(
      'units_count' => 'COUNT(unit_id)' 
     ) 
    ) 
    ->joinLeft(
     'property_special', 
     'special_property_id = property_id', 
     array(
      'specials_count' => 'COUNT(special_id)' 
     ) 
    ) 
    ->group('property_id') 
    ->order('property_name'); 
+0

¿Hay claves únicas unit_id y special_id en las tablas property_unit y property_special? –

+0

@Mark Bannister Sí –

Respuesta

9

Prueba esto:

SELECT 
    `property`.`property_name`, 
    COUNT(distinct unit_id) AS `units_count`, 
    COUNT(distinct special_id) AS `specials_count` 
FROM `property` 
    LEFT JOIN `property_unit` ON unit_property_id = property_id 
    LEFT JOIN `property_special` ON special_property_id = property_id 
WHERE (property_id = '1') 
GROUP BY `property_id` 
ORDER BY `property_name` ASC 

EDIT:

No debería siempre use distinct - resulta ser la opción correcta en este caso.

select count(fieldname) devuelve el número de veces que el nombre de campo no es nulo; select count(distinct fieldname) devuelve el número de valores distintos de fieldname.

En la consulta original, property_unit y property_special no están unidos entre sí, solo a la propiedad, por lo que para una sola propiedad que tenía 5 unidades y 7 especiales, se devolverían 35 filas; por lo tanto, count(unit_id) y count(special_id) devolverían 35. Dado que existirían 5 valores distintos de unit_id y 7 valores distintos de special_id (porque estos campos identifican de forma exclusiva sus registros), count(distinct ...) devuelve los valores correctos en estas circunstancias.

+0

¡Muchas gracias, funciona! Pero no puedo entender por qué siempre debo usar DISTINCT .. –

+0

@DmitryTeplyakov: ver la respuesta actualizada. –

+0

¡Muchas gracias! ¡Es una gran explicación! –

1

Su SQL debería ser algo como esto:

 
SELECT 
    `property`.`property_name`, 
    COUNT(property_unit.unit_id) AS `units_count`, 
    COUNT(property_special.special_id) AS `specials_count` 
FROM `property` 
    LEFT JOIN `property_unit` ON (property_unit.unit_property_id = property.property_id) 
    LEFT JOIN `property_special` ON (property_special.special_property_id = property.property_id) 
WHERE (property.property_id = '1') 
GROUP BY `property.property_id` 
ORDER BY `property.property_name` ASC 

+0

Misma consulta. unit_id y special_id son únicos –

Cuestiones relacionadas