2009-10-06 2 views
12

두 테이블이 있습니다.레코드가 발견되지 않으면 Mysql count return 0이 반환됩니다.

cities - id_city, city_name 
properties - id_property, id_city, property_name 

나는 cities.city_name을 표시 할 나는이 같은 결과를 얻을 수 있도록 내가 레코드가 대신 NULL의 발견되지 않으면 여전히 0을 반환하는 쿼리를 만들 수 있죠 [properties.count(id_city)]

어떻게 옆에 :

London [123] 
New York [0] 
Berlin [11] 

여기서 "뉴욕"은 [0]이고 NULL이 아니며 1이 아니며?

+0

질문이 명확하지 않습니다 .... –

+0

현재 검색어가 무엇입니까? – recursive

+0

나는 조금 더 깨끗하게하기 위해 최선을 다했다. 그래서 그것은 분명했다. –

답변

17

사용은 외부 조인 :

select cities.city_name, count(properties.id_city) 
    from cities left join properties on cities.id_city = properties.id_city 
    group by 1 
+0

cities.city_name을 선택하고 도시에서 계산 (*) 은 cities.id_city = properties.id_city의 속성에 합류합니다 1에 의해 – Preston

+0

잘못되었습니다! 일치가없는 경우에도 "1"로 결과를 제공합니다. –

+0

횟수 (*) 대신 숫자 (속성 .id_property)를 시도합니다. – timdev

1

이 쿼리는 :

SELECT cities.*, COUNT(properties.id_city) as num 
FROM cities 
LEFT JOIN properties on cities.id_city=properties.id_city 
GROUP BY cities.id_city 

가 원하는 0 수를 반환해야합니다, 나는 100 % 확실하지 않다가 MySQL은 그런 식으로 작동하지만, .

13

나는 그것을 테스트하지는 않았지만 다음과 같이 해줄 것이라고 생각합니다. 트릭은 한 테이블에서 속성 수를 가져온 다음 왼쪽에서 해당 테이블을 cities 테이블에 조인하고 IFNULL 함수를 사용하여 NULL을 0으로 변환하는 것입니다.

SELECT city_name, IFNULL(property_count, 0) 
FROM cities 
LEFT JOIN 
    (SELECT id_city, count(*) as property_count 
    FROM properties 
    GROUP BY id_city) city_properties 
    USING (id_city); 
-2

심플. "(Count (*) + 0)"을 사용하십시오. null + 0은 숫자를 리턴합니다.

+0

그러나 목록에 작성된 항목이 없으면 0을 리턴하지 않습니다. – Ben

관련 문제