2012-05-08 50 views
0

我有一個MYSQL查詢從兩個表中選擇。第二個表可能不一定具有與第一個表匹配的聯合ID。讓我們用這兩個作爲例子:加入返回空列?

++++++++++++++++++ 
table: t1 
column: id 
column: test_id 
column: info 

table t2 
column: t2id 
column: test_id 
column: extra_info 
++++++++++++++++++ 

我插入以下這些行到表(這只是所有僞此刻):

insert into t1 values (1, 4, "asd") 
insert into t1 values (2, 25, "dfg") 
insert into t2 values (1, 25, "123") 

現在我的目標是將兩個表連接在一起,但我遇到了連接問題。如果第二個表(t2)似乎沒有匹配的行,它會使原始表中的連接列爲NULL?它爲什麼這樣做?下面是一個例子查詢:

SELECT * FROM `t1` LEFT JOIN `t2` ON (`t1.test_id` = `t2.test_id`) WHERE `t1.id` = 1; 

現在我絕對沒有問題,如果他們匹配,但如果沒有行存在,那麼從T1爲test_id被設置爲NULL ......我的目標某種原因如果有什麼要加入的話,就加入這兩張表。 編輯:如果沒有什麼要加入,那麼我想通過將所有的t2列設置爲NULL或僅僅返回t1數據來從t1返回數據。我需要做一個子查詢嗎?如果是的話,它會是什麼?謝謝:)

+1

左[外]加入意味着「保留每個記錄在左邊」 - 這包括*不*加入記錄在右側的記錄。 – 2012-05-08 23:41:34

+0

你想要發生什麼?你能舉一個預期結果的例子嗎? –

+0

Errr,我意識到現在我可能在我想要的方面有點不清楚。我想要做的是獲取第一個表的信息,並添加第二個表的信息(如果存在)。如果它不存在,那就給我第一個表,第二個表全部設置爲NULL或者第一個表。 – MasterGberry

回答

6

使用INNER JOIN。在連接類型

SELECT * FROM `t1` 
INNER JOIN `t2` ON (`t1.test_id` = `t2.test_id`) 
WHERE `t1.id` = 1; 

文檔:http://dev.mysql.com/doc/refman/5.7/en/join.html

+0

錯誤,我想我不清楚我想要做什麼。檢查我原來的帖子上的編輯。 – MasterGberry

+1

您的修改建議您的原始查詢應按照您的問題中所述的方式工作?如果不是,請提供某種預期輸出。這裏是sqlfiddle:http://sqlfiddle.com/#!2/2db3b/3 – hkf

+0

我搞砸了sql提琴,我幾乎把我的精確查詢與幾個左連接,它工作得很好......也許我的框架在涉及這些連接時做了一些粗略的事情,因爲它似乎從結果中刪除了多個值,並且如果該行不匹配,則將它們設置爲null .... – MasterGberry

1

這就是LEFT JOIN的定義。即使只有連接的左半部分匹配,它也會返回行,如果需要,請在右側填寫NULL

如果您只想獲得有相應右側的行,請使用JOIN而不是LEFT JOIN

1

加入時,建議不要使用「SELECT *」,特別是當您在多個表中具有類似命名的列時,因爲這會引入歧義,並且您可能無法獲得預期的結果。我會建議,而不是:

SELECT t1.*, t2.t2id, t2.extra_info 
FROM `t1` 
    LEFT JOIN `t2` 
    ON (`t1.test_id` = `t2.test_id`) 
WHERE `t1.id` = 1;