2010-03-23 88 views
6

我有一箇舊的表是這樣的:如何加入MySQL表

user> id | name | address | comments 

而且現在我已經創建一個「別名」表中,以便一些用戶有一個別名出於某些原因。我創建了一個新表「user_alias」是這樣的:

user_alias> name | user 

但現在我有我的原因SQL差水平問題......如何加入兩個表來產生這樣的:

1 | my_name | my_address | my_comments 
1 | my_alias | my_address | my_comments 
2 | other_name | other_address | other_comments 

我的意思是,我想要的是,在相同的格式返回的「用戶」表中所有的用戶和別名..事情是這樣的一個「SELECT ...」查詢:

SELECT user.* FROM user LEFT JOIN user_alias ON `user`=`id` 

,但它不我不會爲我工作..

回答

2

喜歡的東西

SELECT user.name, user.address, user.comment FROM user 
UNION ALL 
SELECT user_alias.alias, user.address, user.comment 
    FROM user INNER JOIN user_alias on user.name = user_alias.name 
ORDER BY name 

將讓你接近你想要什麼。

您需要將UNION兩個SELECT一起使用,因爲其他人提出的LEFT JOIN解決方案將只包含結果集中的一行,而不是針對您的問題中指定的兩個別名。

但是,您應該使公用列加入用戶和別名ID列,而不是名稱列。

+0

完美!這是解決方案。我不知道這是否是最好的,但它的工作原理!只有一個小錯誤: SELECT user.name,user.address,user.comment從用戶 UNION ALL SELECT user_alias.alias,user.address,user.comment 從用戶INNER JOIN上user.id = user_alias user_alias。用戶 ORDER BY name – Ivan 2010-03-23 16:40:54

+0

哦,我現在看到你的JOIN了。您應該將user_alias.user重命名爲user_alias.user_id,以更清楚地說明發生了什麼。 – 2010-03-23 16:42:56

3

我想你需要的東西是這樣的:

SELECT user.* 
FROM user 
LEFT JOIN user_alias 
ON user.name=user_alias.name 

原始查詢是不是在連接條件不夠具體。

+0

這隻產生一個id = 1的行,而不是兩個請求。 – 2010-03-23 16:26:25

+0

是的,不工作.. – Ivan 2010-03-23 16:29:55

+0

伊萬,請參閱我的答案,下面。 – 2010-03-23 16:34:43

2
SELECT user.* FROM user LEFT JOIN user_alias ON user.name = user_alias.name 
0

首先 - 您要構建的查詢不是微不足道的,因爲您試圖跨越多行獲得一些結果。所以我會以一種應有的方式爲您提供一個合適的解決方案(請參閱:數據庫開發人員將這樣做的方式:-)。

首先,您應該修改您的user_alias表,使其包含id列但不包含名稱。使用name字段加入您的表並不是一個好主意。原因是可能有兩個Sarah Connors。

SELECT user.*, user_alias.* 
FROM user LEFT JOIN user_alias 
ON user.id=user_alias.id 

這樣你會得到這樣的格式結果::

然後,您可以使用此查詢得到兩個表中的結果

id | name   | address  | comments | user 
------------------------------------------------------------- 
1 | Sarah Connor | Planet Earth | Nice woman | sarah_connor 
2 | Sarah Connor | USA, NY  | Mean woman | sarah_c 
3 | John Connor | USA, NY  | n00b  | john123 

在情況下,當有兩個或user_alias表中對於同一個人的更多記錄(等於id的),你會得到類似這樣的結果:

id | name   | address  | comments | user 
------------------------------------------------------------- 
4 | Bill Clinton | White House | President | bill 
4 | Bill Clinton | White House | President | monica 
+0

問題是,在文件上只有一個別名的情況下,結果集中只返回一行。但OP希望返回兩行(用戶行和單獨的行,將user_alias的別名與來自匹配用戶行的地址和註釋組合在一起)。 – 2010-03-23 16:34:17

+0

更一般的問題是,如果文件上有任何別名,則不會從用戶表中返回原始的未排序行。 – 2010-03-23 16:39:43