2009-10-06 12 views
12

Mam dwie tabele.Mysql count return Zero, jeśli nie znaleziono rekordu

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

chcę wyświetlić cities.city_name a obok niego [properties.count(id_city)]

Jak zrobić kwerendę, która nadal zwraca zero jeśli nie zapisy znajdują zamiast NULL, tak aby uzyskać wyniki tak:

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

gdzie "Nowy Jork" to [0], a nie NULL, a nie 1?

+0

Twoje pytanie nie jest jasne ... –

+0

Jakie jest twoje aktualne zapytanie? – recursive

+0

Zrobiłem co w mojej mocy, aby trochę posprzątać, dzięki czemu było jaśniej. –

Odpowiedz

17

Zastosowanie outer join:

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

wybierz cities.city_name, policz (*) z miast po lewej właściwości łączenia miast.id_city = properties.id_city grupy przez 1 – Preston

+0

jest źle! to daje wyniki z "1", nawet jeśli nie ma wyników –

+0

spróbuj liczyć (properties.id_property) zamiast liczyć (*) – timdev

1

Zapytanie:

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 

powinna zwrócić 0 licznik, w którym chcesz go, choć nie jestem w 100% pewien, że to działa w ten sposób w MySQL .

13

Myślę, że następujące rzeczy zrobią to za Ciebie, chociaż tego nie przetestowałem. Sztuka polega na tym, aby zliczać właściwości w jednej tabeli, a następnie w lewo, aby połączyć tę tabelę z tabelą miast, konwertując wartości NULL na 0 za pomocą funkcji IFNULL.

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

Prosty. Użyj "(Count (*) + 0)". Każde zero plus 0 zwróci liczbę.

+0

Ale nie zwraca wartości 0, jeśli nie ma wpisu utworzonego na liście. – Ben

Powiązane problemy