2011-04-01 43 views
0

我一起加入了大量表格,我想要计算company2city表格中公司的城市数量,并同时将其与公司表格中的某一行相关联,然后查明结束时间是否超过了现在.. company2city是一个与城市表连在一起的多对多表。一个公司可以有很多城市,它位于公司城市表格中。如何将这些表连接在一起?

SELECT COUNT(company2city.cityid) as location, city.city 
FROM company 
INNER JOIN company2city ON company.id = company2city.companyid 
INNER JOIN city ON company2city.cityid = city.id AND company.endtime > now() 
GROUP BY company2city.cityid 

这SELECT语句的工作,但它只能选择在company2city表中有一个实例,如果company.endtime比现在更多()这些城市。我想要的是选择城市表中的所有城市,如果company.endtime()> now()失败,则只会使COUNT(company2city.cityid)位置= 0

我该如何才能做这样的选择语句?

回答

2

我相信你想要的是一个左连接而不是内连接。无论如何,左连接都会加入,并且无法进行连接时返回null。

试试这个

SELECT COUNT(company2city.cityid) as location, city.city 
FROM city 
LEFT JOIN company2city on city.id = company2city.cityid 
LEFT JOIN company on company.id = company2city.companyid 
where company.endtime > now() 
group by city.city 
+0

不幸的是它没有返回空值 – 2011-04-01 18:50:34

+0

@Kevin我改变了声明的组,现在请尝试 – 2011-04-01 18:56:33

+0

是的,我也改变了它,但它没有显示。 – 2011-04-01 18:59:05

1

我想沿着

SELECT COALESCE (COUNT (company2city.cityid), NULL) AS location, city.city 
    FROM company 
     LEFT JOIN company2city 
      ON company.id = company2city.companyid 
     LEFT JOIN city 
      ON company2city.cityid = city.id AND company.endtime > now() 
GROUP BY company2city.cityid 

线的东西应该为你工作。我从来没有在MYSQL中选择coalece,但我知道它可以与Oracle一起工作。但关键是使用左连接而不是内连接。

+0

你从未使用过COALESCE的事实可能解释了你在这里使用它的方式,这实际上没有意义。但是也许你的意思与众不同。我建议你解释你的解决方案背后的想法,有人可能会提出必要的更正。 – 2011-04-01 20:33:20