2011-09-09 208 views
1

我有三張桌子,管理不同的社交媒體帳戶 - 臉譜,推特和linkedin。以下查詢將返回Facebook帳戶正常,但沒有別的 - 我做錯了什麼?每個表都通過user_id字段鏈接,但每個記錄都有自己的id字段。左外連接問題

SELECT 
    bla_facebook_accts.id as facebook, 
    bla_linked_in_accts.id as linkedin, 
    bla_twitter_accts.id as twitter 
FROM 
    bla_facebook_accts 
    LEFT OUTER JOIN 
    bla_linked_in_accts 
    ON 
     (bla_linked_in_accts.user_id = bla_facebook_accts.user_id) 
    LEFT OUTER JOIN 
    bla_twitter_accts 
    ON 
     (bla_linked_in_accts.user_id = bla_twitter_accts.user_id) 
WHERE bla_facebook_accts.user_id = '12'; 

哪裏,我要去錯 - 我只是希望它返回一排,如果用戶對每個表

+3

確實USER_ID 12有一個LinkedIn賬戶? – Cez

+2

如果他們不這樣做,也會搞砸最後的加入。這些看起來像3個完全獨立的查詢。 –

+0

您是否擁有包含所有用戶帳戶的「用戶」表? –

回答

2

與您查詢的問題是,如果用戶沒有Facebook賬號,那麼你將無法獲得有關該用戶的任何信息。如果用戶沒有LinkedIn賬戶,那麼您將無法獲得有關其Twitter帳戶的信息。左連接並不適用於這一目的,但MySQL不支持全外連接,所以作爲一種解決方法,你可以做這樣的事情:

select 
    (select id from bla_facebook_accts where user_id = user.user_id) as facebook, 
    (select id from bla_linked_in_accts where user_id = user.user_id) as linkedin, 
    (select id from bla_twitter_accts where user_id = user.user_id) as twitter 
from 
    (select 12 user_id) user 
+0

@Chris我加了一些解釋。 – Karolis

+0

這是返回一個空記錄集 –

+0

@Chris也許你做錯了什麼。或者您也許嘗試了我的早期版本的查詢,因爲當前有一個錯誤正在糾正。 – Karolis

1

我想你想使用INNER JOIN每個網絡 - 即 - 記錄帳號的想法如果你想返回一個在所有表中都有記錄的行。

SELECT 
    f.id as facebook, 
    l.id as linkedin, 
    t.id as twitter 
FROM 
    bla_facebook_accts f 
    INNER JOIN bla_linked_in_acctsn l ON f.user_id = l.user_id 
    INNER JOIN bla_twitter_accts t ON f.user_id = t.user_id 
+0

-1,這就是我們做內部聯接回到1989年。對於18年來的情況,這是一種反模式?改爲使用顯式連接語法。 – Johan

0

嘗試:

選擇t1.column,t2.column,從表t2.column左外連接上(T1,T2,T3)(t1.user_id = table.user_id和t2.user_id = table.user_id和t3.user_id = table.user_id)

1

以下有關無FB賬戶註釋:

(SELECT 'Facebook' as 'ac', id FROM bla_facebook_accts WHERE user_id=12) 
UNION 
(SELECT 'LinkedIn' as 'ac', id FROM bla_linked_in_accts WHERE user_id=12) 
UNION 
(SELECT 'Twitter' as 'ac', id FROM bla_twitter_accts WHERE user_id=12) 
0

如果您嘗試使用linkedin id進行第二次加入,那麼您將永遠得不到答案,如果您的用戶沒有linkedin帳戶但擁有Facebook帳戶。您需要使用您的源帳戶(臉譜)

SELECT 
    bla_facebook_accts.id as facebook, 
    bla_linked_in_accts.id as linkedin, 
    bla_twitter_accts.id as twitter 
FROM 
    bla_facebook_accts 
    LEFT OUTER JOIN 
    bla_linked_in_accts 
    ON 
     (bla_linked_in_accts.user_id = bla_facebook_accts.user_id) 
    LEFT OUTER JOIN 
    bla_twitter_accts 
    ON 
     (bla_linked_in_accts.user_id = bla_facebook_accts.user_id) 
WHERE bla_facebook_accts.user_id = '12'; 
1

如果要列出所有現有賬戶給定用戶alwaysjoin,不管有多少帳戶用戶擁有,LEFT JOIN(又名LEFT OUTER JOIN)是正確的方法去,但是你必須加入你知道所有用戶都會存在的東西。因此,您應該將查詢基於您的用戶表,並將用戶表中的user_id上的所有表連接起來。

重命名userTable到任何用戶表被稱爲

SELECT 
    facebook.id as facebook, 
    linkedin.id as linkedin, 
    twitter.id as twitter 
FROM 
    userTable 
LEFT JOIN 
    bla_facebook_accts facebook ON (userTable.user_id = facebook.user_id) 
LEFT JOIN 
    bla_linked_in_accts linkedin ON (userTable.user_id = linkedin.user_id) 
LEFT JOIN 
    bla_twitter_accts twitter ON (userTable.user_id = twitter.user_id) 
WHERE 
    userTable.user_id = 12