2010-12-14 71 views
1

假设在表格“ab”中,我有从“a”类和“b”类相处的学生的名字,同样我有表“ac”和“bc”。我应该使用什么SQL查询来获得可以形成组的学生的所有组合(即“相处融洽”)?我该如何将它扩展到n个类? 例如:来自A班的John会与B班的Jen和C班的Steff相处,Jen和Steff会相处。因此,约翰,仁和斯蒂夫可以组成一个组)。加入SQL表格

+5

看起来像一个糟糕的模式设计。 – 2010-12-14 22:38:44

+0

+1 @Mark Byers - 赞同!! – exodream 2011-06-13 00:58:14

回答

0

此查询应该返回所有可以与约翰组在一个组中的所有学生。

WITH ABC AS (SELECT AB.A, AB.B, AC.C FROM (SELECT * FROM AB 
         INNER JOIN BC 
         ON AB.B=BC.B) 
     INNER JOIN AC 
     ON (AC.C=BC.C AND AB.A=AC.A)) 
SELECT STUDENT FROM (
    SELECT AB.B STUDENT FROM ABC WHERE AB.A='John' 
    UNION 
    SELECT AC.C STUDENT FROM ABC WHERE AB.A='John') 
GROUP BY STUDENT 

PS:写快,没有任何语法检查,希望你能够把这个工作:)

1

为此,我将创建两个表,一个学生表(ID,姓名,类)和关系表(student1,student2)。您可能还想为班级的时间,地点等添加班级表。

一个友谊会有两个关系(2,3)和(3,2)来形容它是双向的。一种方式可能是另一名学生的追随者或粉丝。 这可以扩展到3班以上。

然后,您可以使用多个连接来获得朋友的朋友等等以任意深度。

下面是一个查询来获取的朋友(FOF)的朋友:

SELECT fof_details.* 
FROM relationships r 
INNER JOIN relationships fof 
ON r.student2 = fof.student1 
INNER JOIN student fof_details 
ON fof_details.id = fof.student2 
WHERE r.student1 = '12'; 

也有专门做图建模作出这样的数据库引擎。

http://openquery.com/blog/graph-engine-mkii

0

初始查询可以通过代码

select ab.a, ab.b, ac.c 
from 
ab inner join 
bc on ab.b = bc.b inner join 
ac on ac.a = ab.a and bc.c = ac.c 

加紧N个类别满足将获得正越来越复杂= 4将与另外三个同样的查询连接

inner join ad on ab.a = ad.a 
inner join bd on bd.b = ab.b and ad.d = bd.d 
inner join cd on cd.c = ac.c and ad.d = cd.d 

2类要求1个表和没有连接,
3班需要3代表一ND 2连接,
4类需要6张桌子和5加入

所以我们可以看到它变得越来越复杂,因为我们继续

0

首先,你不希望有一个表中的每个类。您正在多个表中捕获相同类型的信息,这通常被认为是不好的做法。你想“规范化”你的数据,以便在同一个地方存在相同的数据。

其次,适当地命名您的表,以便您了解实际尝试构建的内容。也许你总是想通过在问题中使用“ab”来掩盖你对实际实现的意图,但是如果你在你的实际代码中这样做,它将会长期伤害你。

看来你需要的名字一个人表以及您跟踪谁是朋友,谁一个朋友表:

create table people (id int, name char(128)); 
create table friends (id int, person_id int, friend_id int); 

然后你只需要具备查询来获取组:

SELECT person.* FROM friends 
INNER JOIN friends grp 
     ON friends.friend_id = grp.person_id 
INNER JOIN people person 
     ON person.id = grp.friend_id 
WHERE friends.person_id = 42;