2011-04-01 27 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