2011-12-16 5 views
1

学生のsidがプロジェクトpidに含まれていることを示すテーブルSP(sid、pid)があるとします。 は、今私は、MySQLのクエリは、すべてのプロジェクトに少なくとも関与学生のペア、そして彼らが協力するプロジェクトの数を選択したい例えばグラフ内のエッジの重みを求めるMySQLクエリ


入力:
S1     P1
S1     P2
S2     P1
S3     P1
S4     P1
S4     P2

出力:

S1     S2   S1     S3   S1     S4   S2     S3   S2     S4   S3     S4  

+0

はこの宿題ですか?もしそうなら、それを '[宿題]'としてタグ付けします。 –

+0

いいえ、そうではありません。研究の質問。 –

答えて

5

エリックの答えは少しは改善されることがあります。

select 
    sp1.sid as sid1, 
    sp2.sid as sid2, 
    count(*) as num 
from 
    sp as sp1 
    inner join sp as sp2 on sp1.pid=sp2.pid and sp1.sid<sp2.sid 
group by sp1.sid, sp2.sid 
; 

代わり<の使用<> geting回避するために、(1,4,2)と(4,1,2)

+0

あなたは、クエリの最後に余分)があります。 –

+0

@BrianHoover:見つからない - 編集しましたか? –

+0

ありがとう!それは完璧に動作します:) –

1

これを行うための別の方法です。

select sid, sid2, count(*) from (
select sp.sid, second_student.sid as sid2,sp.pid from sp 
    join sp as second_student where sp.pid = second_student.pid and sp.sid < second_student.sid) as students 
    group by sid, sid2; 
+0

なぜサブクエリですか?それは必要ではありません。 –

+0

ありがとう!それは完璧に動作します:) –

1

自体にテーブルを結合:

ここ
select 
    s1.StudentId, 
    s2.StudentId, 
    Count(1) as ProjectCount 
from 
    StudentProjects s1 
    inner join StudentProjects s2 on 
     s1.ProjectId = s2.ProjectId 
     and s1.StudentId <> s2.StudentId 
group by s1.StudentId, s2.StudentId 

インクルードは、プロジェクトが同じですが、学生が自分自身でない場合条件がある参加。ただし、学生が自分で作業したプロジェクトは除外されます。それがあなたと一緒なら大丈夫です。そうでない場合は、inner joinの代わりにleft joinを使用する必要がありますが、同じ結合条件が適用されます。

+0

ありがとう!それは完璧に動作します:) –

関連する問題