MySQL Left Outer Join со счетчиком из объединенной таблицы, Показать все записи - PullRequest
0 голосов
/ 06 октября 2010

Я пытаюсь создать запрос, в котором есть количество связанных записей из другой таблицы.Я хотел бы, чтобы "родительские" записи содержали связанные записи (количество) или нет.

SELECT r.region_name, r.region_id, r.abbreviation, r.map_order,
    (IFNULL( COUNT( p.property_id ) , 0 )) AS propertyCount
FROM  `rmp_region` r
LEFT OUTER JOIN  `rmp_property` p 
    ON p.path LIKE CONCAT(  '%/', r.region_id,  '/%' ) 
WHERE p.active =1
AND r.parent_region_id =1
GROUP BY r.region_name, r.region_id, r.abbreviation, r.map_order
ORDER BY r.map_order ASC 

Я пробовал разные варианты этого, но не могу отобразить родительские записи, есликоличество равно нулю / нет связанных записей.

спасибо за любую помощь!

Ответы [ 2 ]

2 голосов
/ 06 октября 2010

Вам нужно переместить «p.active = 1» из предложения WHERE в критерии OUTER JOIN.

Вот ваш пример с изменением:

SELECT r.region_name, r.region_id, r.abbreviation, r.map_order,
    (IFNULL( COUNT( p.property_id ) , 0 )) AS propertyCount
FROM  `rmp_region` r
LEFT OUTER JOIN  `rmp_property` p 
    ON p.path LIKE CONCAT(  '%/', r.region_id,  '/%' ) and p.active =1
WHERE r.parent_region_id =1
GROUP BY r.region_name, r.region_id, r.abbreviation, r.map_order
ORDER BY r.map_order ASC 
1 голос
/ 23 декабря 2010

Вы спрашивали об его оптимизации, надеясь, что индекс в столбце «путь» может помочь. К сожалению, вы ищете значение пути, которое соответствует LIKE CONCAT( '%/', r.region_id, '/%' ), и ни один индекс в мире не настолько умен, чтобы работать с этим.

...