2011-12-07 40 views
5

Tôi muốn nhận được tên và số lượng đơn vị và số lượng đếm. Tôi có truy vấn này:Double LEFT JOIN

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 

Nhưng nó không hoạt động bình thường. Nếu tôi có một trong những trái này tham gia - đó là ok, nhưng nếu tôi có hai, tôi nhận được kết quả này:

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

Đặc biệt số là 2 và units_count là 2, nhưng các đơn vị đếm thực sự '1' là. Làm thế nào tôi có thể nhận được số lượng chính xác cho nó?

PS: đối với những người biết 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

Các khóa đơn vị có phải là unit_id và special_id trên bảng property_unit và property_special không? –

+0

@Mark Bannister Có –

Trả lời

9

Hãy thử điều này:

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:

Bạn không nên luôn luôn sử dụng riêng biệt - đó sẽ là tùy chọn phù hợp trong trường hợp này.

select count(fieldname) trả lại số lần tên trường không phải là rỗng; select count(distinct fieldname) trả về số giá trị riêng biệt của tên trường.

Trong truy vấn ban đầu, property_unit và property_special không được nối với nhau, chỉ cho thuộc tính - vì vậy đối với một thuộc tính duy nhất có 5 đơn vị và 7 đặc biệt, 35 hàng sẽ được trả về; do đó, count(unit_id)count(special_id) sẽ trả về 35. Vì sẽ có 5 giá trị riêng biệt của unit_id và 7 giá trị riêng biệt của special_id ( các trường này xác định duy nhất hồ sơ của chúng), count(distinct ...) trả lại giá trị chính xác trong các trường hợp này.

+0

Rất cảm ơn, nó hoạt động !! Nhưng tôi không thể hiểu tại sao tôi nên luôn luôn sử dụng DISTINCT .. –

+0

@DmitryTeplyakov: xem câu trả lời cập nhật. –

+0

Cảm ơn bạn rất nhiều !! Đó là lời giải thích tuyệt vời! –

1

SQL của bạn nên được một cái gì đó như thế này:

 
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

cùng một truy vấn. unit_id và special_id là duy nhất –