2013-07-22 89 views
2

我想從表中從兩個關係表SQL - 「合併」 3代表與JOIN

結構取決於選擇的用戶:

[user] 

uid | firstname | lastname | ... 
--------------------------------- 
482 | USERa  | USERa | ... 
885 | USERb  | USERb | ... 
405 | USERc  | USERc | ... 
385 | USERd  | USERd | ... 

[news_info] 

uid_local | uid_foreign 
-------------------------------- 
125   | 482  
100   | 405  

[news_add] 

uid_local | uid_foreign 
-------------------------------- 
125   | 885 
105   | 385 

現在我想選擇只能通過uid_local用戶A和用戶B - > 125,從[news_info]和[news_add]

SELECT 
    nnfo.uid_local, 
    user.* 
FROM user 
    JOIN news_info nnfo 
    ON nnfo.uid_foreign = user.uid 
WHERE nnfo.uid_local = 125 

結果= USERA //工作

SELECT 
    nadd.uid_local, 
    user.* 
FROM user 
    JOIN news_add nadd 
    ON nadd.uid_foreign = user.uid 
WHERE nadd.uid_local = 125 

結果= USERB //工作

現在 「合併」 的SQL語句轉換成一個......讓a和UserB

SELECT 
    nnfo.uid_local, 
    nadd.uid_local, 
    user.* 
FROM user 
    JOIN news_info nnfo 
    ON nnfo.uid_foreign = user.uid 
    JOIN news_add nadd 
    ON nadd.uid_foreign = user.uid 
WHERE nnfo.uid_local = 125 AND nadd.uid_local = 125 

結果=空//沒有錯誤.....

什麼是錯的...我tryed其他一些聲明,但沒有結果:(

回答

1

當合並查詢的結果,有2種不同的方法:

  • UNION
  • JOIN的

要知道選擇哪一個您必須知道您希望合併的2個查詢中的表格之間是否存在技術關聯。在你的情況下,有一個功能鏈接(nnfo.uid_local = 125 AND nadd.uid_local = 125),但加入這兩個宇宙是不夠的。你仍然可以可能得到的結果只有一個SELECT,但我認爲最終的結果將不明確,不知道SQL提供什麼精神。

我會去朝UNION解決方案:

SELECT 
    nnfo.uid_local, 
    user.* 
FROM user 
    JOIN news_info nnfo 
    ON nnfo.uid_foreign = user.uid 
WHERE nnfo.uid_local = 125 
UNION 
SELECT 
    nadd.uid_local, 
    user.* 
FROM user 
    JOIN news_add nadd 
    ON nadd.uid_foreign = user.uid 
WHERE nadd.uid_local = 125 

編輯:我看到davek的結果實現UNION ALL而不是UNION。我假設你只想返回USERa一次,如果它碰巧出現在兩個獨立的查詢中,那就是爲什麼我使用簡單的UNION運算符與UNION ALL這將返回重複的結果。

+0

您的答案和davek的答案是什麼邏輯差異? –

+0

我不認爲有任何,除了聯盟所有的事情 – Sebas

+0

謝謝davek和塞巴斯...與聯盟只有不聯盟所有我得到我的結果沒有重複,如你所說:) – Jim

2

uid_local的ID存在於不同行:所以當你想和結果,你什麼也得不到(如無交叉)。你可以用工會做到這一點:

SELECT * from 
(
SELECT 
    nnfo.uid_local, 
    user.firstname, user.lastname 
FROM user 
    JOIN news_info nnfo 
    ON nnfo.uid_foreign = user.uid 
WHERE nnfo.uid_local = 125 

UNION ALL 

SELECT 
    nadd.uid_local, 
    user.firstname, user.lastname 
FROM user 
    JOIN news_add nadd 
    ON nadd.uid_foreign = user.uid 
WHERE nadd.uid_local = 125 
) x 
+0

這工作,但我只能用兩個SELECT語句來做到這一點? – Jim

+0

@Jim:看看我的編輯:你可以在一個外面的SELECT中包裝。 – davek

+0

是的......但這意味着我有三個SELECT的IM不知道這是否有效 – Jim