2017-07-18 35 views
0

我想加入3個表中類似如下的方式:MySQL的:加入3個表,並選擇相同的行作爲別名

SELECT a.id 
FROM tableA AS a 
LEFT JOIN tableB AS b ON a.id = b.id 
LEFT JOIN tableC AS c ON a.id = c.id 
WHERE 
b.name = c.name OR b.name IS NULL OR c.name IS NULL; 

我不能肯定,該表B或C將有行加入,但如果兩者都有一行要加入,名稱列必須相同。

我的問題是:我想選擇這個名稱列,但我只想選擇它一次。所以,如果b和c有一行要加入,我想要它們中的任何一個的名字,如果只有一行有一行要加入,我想要那個行的名字。 結果中的列名應該在每種情況下都是相同的。

表實例

TABLEA

id 
---- 
    1 
    2 
    3 
    4 

tableB的

id | name 
----|------ 
    2 | X 
    3 | Y 

表C

id | name 
----|------ 
    2 | Q 
    3 | Y 
    4 | Z 

期望的結果:

id | name 
----|------ 
    1 | (NULL) 
    2 | X  (name is from tableB) 
    2 | Q  (name is from tableC) 
    3 | Y  (name is from tableB or tableC) 
    4 | Z  (name is from tableC) 
+0

tableB的兩次提及。 – Strawberry

+0

謝謝,我更正了它 – jacksbox

回答

0
SELECT a.id, IFNULL(b.name, c.name) 
FROM tableA AS a 
LEFT JOIN tableB AS b ON a.id = b.id 
LEFT JOIN tableC AS c ON a.id = c.id 
WHERE 
b.name = c.name OR b.name IS NULL OR c.name IS NULL; 

此查詢應該返回你想要的。 IFNULL(X, Y)的工作原理是如果X爲空,則使用Y.以您的示例爲例,如果b.name不爲null,則會顯示b.name。如果b.name爲空,則會顯示c.name。如果c.name中有內容,則會打印該名稱,但如果c.name爲空,NULL將按您的需要顯示。

+0

是的 - 你的陳述是正確的。我收回評論。 ;-) – Strawberry

+0

我需要where語句,因爲它是可能的,有多個相同的id具有不同的名稱,這應該比匹配的名稱 – jacksbox

+0

具有不同名稱的多個相同的id似乎違背您的聲明「.. 。但是如果兩者都有連接的行,則名稱列必須相同。「雖然我可能不會理解,但是這樣的例子或者提及它出現在你的問題中的例子會很有幫助。 – yanman1234

0

我希望這將有助於你

SELECT 
    a.id, 
    (CASE COALESCE(b.`name`, '') WHEN '' THEN c.`name` ELSE b.`name` END) AS name2, 
    b.`name` AS B, 
    c.`name` AS C 
FROM foo1 AS a 
LEFT JOIN foo2 AS b ON (a.id = b.id) 
LEFT JOIN foo3 AS c ON (a.id = c.id) 
ORDER BY a.id; 
0

另一種可能性,將是最好的達到所有去掉左邊,如果沒有必要的。

SELECT a.id, b.name 
FROM tableA AS a 
LEFT JOIN tableB AS b ON a.id = b.id 
UNION 
SELECT a.id, c.name 
FROM tableA AS a 
LEFT JOIN tableC AS c ON a.id = c.id 

,如果你不想在那裏的名字是空行,刪除LEFT

相關問題