2012-02-21 127 views
-1

我見過類似的問題,但其中很多是不同的情況,我只是不能讓它像我想要的那樣工作,所以我來這裏尋求一些幫助。返回0上count()

用戶有幾個他們在一定時期內居住過的城市。

我該如何計算返回0到他們所屬的所有其他城市,但不在BETWEEN日期之外?

SELECT cityname, COUNT(cityname) AS city_count 

FROM cities 

LEFT OUTER JOIN people ON cities.id = people.cityid 

WHERE firstname = 'John' AND lastname = 'Doe' 

AND RESIDENCY_DATE 

BETWEEN '1996-08-01' 

AND '1997-05-31' 

GROUP BY cityname 

查詢輸出:

city | city_count 
    ___________________ 

    cali   1 
    seattle  2 

預期輸出:

city | city_count 
    ___________________ 

    cali   1 
    seattle  2 
    washington 0 
    new york  0 

我想這算什麼日期間在,只是返回0所有其他城市,他們曾經住過。

(其中people.cityid列中的所有行)

+0

什麼是表結構的兩個表?哪個表是每個列?你的數據是什麼樣的? – 2012-02-21 09:04:43

回答

1

以下內容應該有效。還採取了清理BETWEEN邏輯的自由,以確保它匹配包括1997-05-31在內。

這將選擇所有城市,再算上了符合標準,人們特別

SELECT 
    cities.cityname, 
    COALESCE(COUNT(inTimePeriod.id),0) AS city_count 

FROM cities 

// Find all cities the user has lived in 

INNER JOIN people AS hasLivedIn 
    ON hasLivedIn.cityid = cities.id 
    AND people.firstname = 'John' 
    AND people.lastname = 'Doe' 

// Now rejoin the ones that they've lived in in the specified time 

LEFT JOIN people AS inTimePeriod 
    ON inTimePeriod.cityid = hasLivedIn.cityid 
    AND inTimePeriod.RESIDENCY_DATE BETWEEN DATE('1996-08-01') AND DATE('1997-05-31') 

GROUP BY cities.cityname 
+1

哦,爲什麼你還在那裏:)我以爲你去睡覺了? ;)另外,你繼續使用我以前沒聽說過的關鍵字! – Tek 2012-02-21 08:50:39

+0

我醒了;)它總是很好的採摘一個新的空氣 - 只要確保它不是一個錯字:D – 2012-02-22 00:14:03

+0

再次感謝,讓我有點得到它的權利。列名並不完全一樣,但最終都完成了。不能夠感謝你:) – Tek 2012-02-22 03:42:26

0

使用COUNT(DISTINCT)則返回0,如果沒有匹配的行。

如下嘗試:

SELECT cityname, COUNT(distinct cityname) AS city_count 
    FROM cities 
    LEFT OUTER JOIN people ON cities.id = people.cityid 
    WHERE firstname = 'John' AND lastname = 'Doe' 
    AND RESIDENCY_DATE 
    BETWEEN '1996-08-01' 
    AND '1997-05-31' 
    GROUP BY cityname 
+0

出於某種原因,不同的數字它錯了。好吧。 – Tek 2012-02-22 03:41:10