2011-06-09 40 views
0

我需要連接兩個表:MySQL的加入聲明

國表

country|lang1|lang2|lang3|lang4 
Canada |1 |2 |NULL |NULL 
US  |1 |NULL |NULL |NULL 

語言表

id|language 
1 |English 
2 |French 

我要爲兩行的返回值我的國家的表與語言名稱。

我該怎麼做?

我想:

SELECT * FROM en_countries LEFT JOIN all_languages 
ON (all_languages.id = en_countries.lang1 AND all_languages.id = en_countries.lang2) 

但是這並沒有給我的語言名稱。我該怎麼做呢?

如果有人可以給我這個活動記錄格式,這將是一個獎金。我正在爲CodeIgniter做這件事。

回答

1

我覺得這裏的問題是與(all_languages.id = en_countries.lang1 AND all_languages.id = en_countries.lang2)

而嘗試

SELECT * FROM en_countries LEFT JOIN all_languages 
ON (all_languages.id = en_countries.lang1 OR all_languages.id = en_countries.lang2) 

的「和」意味着一種語言應該是一個國家的第一和第二語言,替換爲'或'可能會訣竅

+0

完美。謝謝。這工作正常,但我更喜歡下面的解決方案。 – sehummel 2011-06-09 20:45:00

1

我不確定我是否正確地得到了您的問題,但聽起來您應該使用inner join而不是left joinSee this


select country.* 
from en_countries as country 
join all_languages as lang1 
on lang1.id = country.lang1 
join all_languages as lang2 
on lang2.id = country.lang2 
-- optionally: 
where lang1.id = ? 
and lang2.id = ? 
+0

INNER JOIN不會返回數據庫中的任何行 – sehummel 2011-06-09 20:41:29

+0

嗯,你需要兩個連接。給我一下,我會更新我的答案。 :-) – 2011-06-09 20:44:10

0

您需要從all_languages中選擇兩個t輸入法

SELECT en_countries.country, t1.language as lang1, t2.language as lang2 FROM en_countries  
JOIN all_languages AS t1 ON t1.id = en_countries.lang1 
JOIN all_languages AS t2 ON t2.id = en_countries.lang2 

那麼我相信你的PHP訪問爲$按行>語言1

+0

這也適用,但返回單行,這更理想。我如何訪問我的PHP中的t1和t2。在foreach循環中,它會是$ row-> t1嗎? – sehummel 2011-06-09 20:47:49

+0

我不使用PHP,但我認爲你需要給列賦一個獨特的名字。請參閱編輯 – David 2011-06-10 13:09:19

1

首先,您使用AND這意味着,只用相同的語言1記錄等於LANG2將加盟。我相信你需要這樣的東西:

SELECT c.*, l1.language as lang1_name, l2.language as lang2_name 
FROM en_countries c 
LEFT JOIN all_languages l1 ON (l1.id = c1.lang1) 
LEFT JOIN all_languages l2 ON (l2.id = c1.lang2)