2010-12-14 67 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;