2013-03-15 63 views
0

我有查詢:執行與加入查詢連接到可能不存在行

SELECT `gigs`.*, COUNT(`signups`.`signupID`) AS `signupsPending` FROM `gigs` NATURAL JOIN `signups` WHERE (`signupStatus` = 4) GROUP BY `gigID` 

即查詢,看起來像這樣一個數據庫:

+-------+---------+------------+ 
| gigID | gigName | gigDate | 
+-------+---------+------------+ 
| 1  | Foo  | 01/01/2014 | 
+-------+---------+------------+ 
| 2  | Bar  | 16/01/2014 | 
+-------+---------+------------+ 


+----------+-------+--------------+--------------+ 
| signupID | gigID | signedUserID | signupStatus | 
+----------+-------+--------------+--------------+ 
| 1  | 1  | 1   | 1   | 
+----------+-------+--------------+--------------+ 
| 2  | 1  | 2   | 4   | 
+----------+-------+--------------+--------------+ 
| 3  | 1  | 3   | 2   | 
+----------+-------+--------------+--------------+ 
| 4  | 2  | 1   | 2   | 
+----------+-------+--------------+--------------+ 

但是當我做查詢上面,它只顯示gigID = 1的行。我怎樣才能改變上面的查詢,所以它會顯示0與行的其餘部分?

+0

外部聯接隊友:http://mysql-tips.blogspot.co.uk/2005/04/mysql-outer-join-sql-tutorialexamples.html – Raad 2013-03-15 16:40:15

+0

我做嘗試外部連接,但沒有其他事情發生 – topherg 2013-03-15 16:44:53

+0

對不起 - 隊友 - 術語模糊。 'LEFT'和'LEFT OUTER'是一樣的,並且使我傾向於將'OUTER'和'LEFT'交替地處理(我不好)。 – Raad 2013-03-15 16:55:30

回答

0

我一直在努力OUTER JOIN的,但是這並沒有產生任何結果,但我現在已經嘗試過:

SELECT `gigs`.*, COUNT(`signups`.`signupID`) AS `signupsPending` FROM `gigs` LEFT JOIN `signups` ON `gigs`.`gigID` = `signups`.`gigID` AND `signupStatus` = 4 GROUP BY `gigID` 

這是偉大的工作

0

使用LEFT OUTER JOIN,而不是自然科學JOIN。

SELECT `gigs`.*, COUNT(`signups`.`signupID`) AS `signupsPending` 
FROM `gigs` 
LEFT OUTER JOIN `signups` 
WHERE (`signupStatus` = 4) GROUP BY `gigID` 
0

你想用LEFT JOIN(要能爲ANSI-92兼容添加OUTER

SELECT 
    gig.* 
, COUNT(sig.signupID) AS "signupsPending" 
FROM gigs AS gig 
LEFT JOIN signups AS sig ON (gig.gigID = sig.gigID) 
WHERE sig.signupStatus = 4 
GROUP BY gig.gigID 

順便說一句,我建議你不要使用NATURAL JOIN,因爲它帶來了一些風險

  • 它是基於字段名,你可以有不同的字段名稱爲外鍵
  • 迥異耳鼻喉科外鍵可以用來連接2個表(即使你可以添加一個USING語句)
  • 在你的數據庫生命表可以得到場改加,你將總是要檢查兩個表沒有得到新的領域具有相同名稱的
  • 如果同時使用NATURAL和標準JOIN的IT可能很難通過腳本
  • 自動化您查詢......
+0

我曾嘗試將NATURAL JOIN轉換爲LEFT JOIN,但作爲一個原則問題,我傾向於堅持保持與本地密鑰ID匹配的外鍵ID,但我明白了您的觀點 – topherg 2013-03-15 16:48:50

+0

也有2個表不總是JOINt與相同的鍵。 – 2013-03-15 16:52:35

+0

我已經明確地經歷過這個問題,它拋出的錯誤,字段名稱是模棱兩可的,即使它們在相同的地方,在那些情況下,我總是使用LEFT JOIN – topherg 2013-03-15 16:54:01