2010-12-14 25 views
1

テーブル "ab"に、クラス "a"とクラス "b"から取得する生徒の名前があり、同様にテーブル "ac"と "bc"があるとします。グループを構成できる学生(つまり「一緒に行こう」)のすべての組み合わせを可能にするために、どのようなSQLクエリを使用する必要がありますか?そして、これをどのようにn個のクラスに拡張できますか? 例:クラスaのJohnは、クラスbのJenとクラスcのSteff、そしてJenとSteffが一緒になります。したがって、John、Jen、Steffはグループを形成することができます)。SQLテーブルを結合する

+5

悪いスキーマ設計のようです。 –

+0

+1 @マークバイヤーズ - 合意しました! – exodream

答えて

0

このクエリは、で1つのグループに属することができるすべての生徒を返す必要があります。

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

私は2つのテーブル、学生テーブル(ID、名前を作成し、クラス)と関係テーブル(student1、student2)を含む。クラスの時間、場所などのクラステーブルを追加することもできます。

友情には2つの関係(2,3)と(3,2)の2つの関係があります。 1つの方法は、他の生徒のフォロワーまたはファンかもしれません。 これは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

最初のクエリは、追加の3

に参加すると、同じクエリになり

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個のクラスにステップアップすると、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クラスは
3のクラスは、3つのテーブルが必要、1つのテーブルを必要とせず、全く参加しますND 2加わり、
4クラスは6つのテーブルを必要とし、5は

に参加するので、我々はそれが我々が

0

ファーストを進めるよう、各クラス用のテーブルを持っている必要はありません、徐々に、より複雑になっ見ることができます。複数のテーブルで同じタイプの情報をキャプチャしていますが、これは一般的に悪い習慣とみなされます。同じデータが1か所に存在するようにデータを「正規化」する必要があります。

次に、実際にビルドしようとしていることを理解できるように、テーブルに適切な名前を付けます。多分あなたは、実際の実装の意図が "質問"に "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; 
関連する問題