2012-03-15 144 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