2012-02-21 128 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