2012-03-15 18 views
4

在我的數據庫中有4個關係表,並希望加入他們以獲得總值...例如,我有朋友,家人,跟隨和熟人,並且想要加入這些以獲得「ALL 「價值。在SQL查詢中加入4個表

表格式是這樣:

朋友

id follower following 
--------------------- 
1  2  3 
2  4  5 

家庭

id follower following 
--------------------- 
1  5  6 
2  7  8 

id follower following 
--------------------- 
1  9  10 
2  11  12 

熟人

id follower following 
--------------------- 
1  13  14 
2  15  16 

是正確的查詢參加全部4個表...

SELECT following 
FROM friends 
     INNER JOIN family ON friends.following=family.following 
     INNER JOIN following ON friends.following=following.following 
     INNER JOIN acquaintances ON friends.following=acquaintances.following 
WHERE follower='id' 

基本上我想加盟,檢索所有四個表的「下面的」值其中id =我的編號

+0

取決於你的表的數據量分開,如果你真的想這樣簡單的查詢,我會使用「UNION」查詢每個表,應該快很多,然後加入所有4個表。 – Rufinus 2012-03-15 10:41:20

回答

5

您當前的查詢將只列出結果如果所有表與你的朋友表有聯繫。我相信你更期待這樣的事情

SELECT following 
FROM friends 
WHERE follower='id' 
UNION ALL 
SELECT following 
FROM family 
WHERE follower='id' 
UNION ALL 
SELECT following 
FROM following 
WHERE follower='id' 
UNION ALL 
SELECT following 
FROM acquaintances 
WHERE follower='id' 

或者更好一點讀,更容易在一些性能

SELECT following 
FROM (
     SELECT following, follower FROM friends 
     UNION ALL SELECT following, follower FROM family 
     UNION ALL SELECT following, follower FROM following 
     UNION ALL SELECT following, follower FROM acquaintances 
     ) AS f 
WHERE follower='id' 

UNION

UNION成本調整使用將來自多個SELECT語句 的結果合併爲一個結果集。

+1

此解決方案工作喜歡魅力! :)謝謝 – user946742 2012-03-15 12:24:57

+0

也與我一起工作!十分感謝! – Elemento0 2015-11-30 17:11:57

0

在我對這種情況表示意見,並根據你在你的X-表我會用聯盟的數據量:

(SELECT following FROM friends WHERE follower='id') 
UNION 
(SELECT following FROM family WHERE follower='id') 
UNION 
(SELECT following FROM following WHERE follower='id') 
UNION 
(SELECT following FROM acquaintances WHERE follower='id') 
1

你要做到這一點:

SELECT following FROM friends WHERE follower='id' 
UNION 
SELECT following FROM family WHERE follower='id' 
UNION 
SELECT following FROM followers WHERE follower='id' 
UNION 
SELECT following FROM acquaintances WHERE follower='id' 

這將產生

following 
--------------------- 
3 
4 
6 
8 
10 
12 
14 
16 

它migh不過要把朋友,家人,追隨者和熟人都放在同一張桌子上,除非這些類別之間的差異足夠大,不值得擁有自己的桌子。

1

不是。如果我將你的例子簡化爲朋友和家人,加入他們將只返回既是朋友又是家人的人,並允許你從一行中的所有表中提取id,這幾乎是無用的。

你想要的是一個工會,正如其他答案所表明的那樣。然而,更好的選擇可能是讓一個關係表具有一個特殊的(enum?)列來定義它的類型,而不是每種關係都有一個表。

0

你應該重新設計實體表。 朋友,家人,熟人可以通過場

id follower following type 
--------------------------------- 
1  5  6  Family 
2  7  8  Friends 
3  13  14  Acquaintance 
4  15  16  Friends 

,那麼你可以過濾,命令或分組由type