2008-10-15 91 views
1

我從MySQL SELECT詢問涉及LEFT JOIN奇怪的結果,我不明白我對LEFT JOIN的理解是否是錯誤的,或者我是否看到一個真正奇怪的行爲。MySQL LEFT JOIN SELECT不選擇所有左側記錄?

我有一個多對一關係的兩個表:對於table 1中的每個記錄,table 2中有0個或更多記錄。我想選擇表1中的所有記錄,並在列中計算表2中相關記錄的數量。據我所知,LEFT JOIN應始終返回語句的LEFT一側的所有記錄。

這是一個測試數據庫中表現出的問題:

CREATE DATABASE Test; 
USE Test; 

CREATE TABLE Dates (
    dateID INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    date DATE NOT NULL, 
    UNIQUE KEY (dateID) 
) TYPE=MyISAM; 


CREATE TABLE Slots (
    slotID INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    dateID INT UNSIGNED NOT NULL, 
    UNIQUE KEY (slotID) 
) TYPE=MyISAM; 

INSERT INTO Dates (date) VALUES ('2008-10-12'),('2008-10-13'),('2008-10-14'); 
INSERT INTO Slots (dateID) VALUES (3); 

日期表有三個記錄,以及插槽1 - 而該紀錄指向日期的第三個記錄。

如果我做下面的查詢..

SELECT d.date, count(s.slotID) FROM Dates AS d LEFT JOIN Slots AS s ON s.dateID=d.dateID GROUP BY s.dateID; 

..我希望看到一個表,3行中 - 兩次與計數0,和一個與1計數但我實際看到的是:

+------------+-----------------+ 
| date  | count(s.slotID) | 
+------------+-----------------+ 
| 2008-10-12 |    0 | 
| 2008-10-14 |    1 | 
+------------+-----------------+ 

出現零計數的第一條記錄,但忽略具有零計數的較晚記錄。

我做錯了什麼,或者我只是不明白左連接應該做什麼?

回答

6

你需要GROUP BY d.dateID。在你的兩個案例中,s.DateIDNULLLEFT JOIN),並將它們組合在一起。

我想你也會發現這是無效的(ANSI)SQL,因爲d.date不是GROUP BY的一部分,也不是集合操作的結果,不應該是SELECT ed。

2

我想你的意思是按d.dateId分組。

1

嘗試通過s.dateID

去除GROUP
1

10-12和10-13的dateid由您分組在一起。由於它們是2空值,因此計數值被計算爲0

0

用d.dateID替換GROUP BY s.dateID。

1

我不知道這是否是有效的MySQL,但你很可能使用以下語法而不是

SELECT date, count(slotID) as slotCount 
FROM Dates LEFT OUTER JOIN Slots USING (dateID) 
GROUP BY (date) 

通過使用使用條款作廢,將來這個錯誤你沒有獲得兩個dateID的保持對...的跟蹤。

+0

它在MySQL中工作(只是測試它,並提供與其他答案相同的正確結果)。 – 2008-10-15 20:30:55