2011-02-23 4 views
2

質問を1つの文に入力できないので、例を挙げます。あなたは、データベース内の次のテーブルを持っていると言う:SQLで列のペアを選択する方法

Users(id, name) 
Friends(id1, id2) 

Friends(id1)Friends(id2)Users(id)を参照して、両方の外部キーです。一方の側のユーザーIDと他方の側のすべてのユーザーを取得するために、クエリはどのように見えますか。友人のテーブル内のデータは次のようなものになります。

id1 id2 
------- 
1 2 
1 3 
1 4 
2 3 
2 4 
2 5 
5 1 

をそして私はこのような出力が欲しい:

id1 id2 
------- 
1 2 
1 3 
1 4 
1 5 
2 1 
2 3 
2 4 
2 5 
3 1 
3 2 
4 1 
4 2 
5 1 
5 2 

すべてのユーザIDが左側にすべきであり、そのユーザーIDの友人はすべてべき右にある。私はいくつかの種類のクロス製品をしなければならないと思うが、正しい出力を得ることはできない。どのようにこれを行うにはどのようなアイデア?ありがとう。 id2,id1id1,id2

一緒
+0

フレンドシップテーブル(両側)に2つの関係レコードを作成するのが一般的です。この場合、あなたは決してそのような問題を抱えませんでした。 – zerkms

+0

@zerkmsしたがって、テーブルは常に必要な倍の大きさになるでしょうか? – styfle

+0

技術的には、はい、友情を探すのに効率的であるという利点があります。 – mellamokb

答えて

1

union組み合わせは:

;with FriendShips as (
    select 
     id1, id2 
    from 
     Friends F1 

    union 

    select 
     id2, id1 
    from 
     Friends F2 
) 
select 
    u1.name, u2.name 
from 
    FriendShips F 
inner join 
    Users u1 on F.id1 = u1.id 
inner join 
    Users u2 on F.id2 = u2.id 
+0

興味深い。なぜWITHを使用しますか?私はかつてそれを見たことがない。このクエリは同じ結果を得たようです: SELECT u1.name AS UserName、u2.name AS FriendName FROM(SELECT f.id1、f.id2 FROM friends f UNION SELECT f.id2、f.id1 FROM friends f)右外部JOINユーザーu1 ON u1.id = id1 RIGHT OUTER JOINユーザーu2 ON u2.id = id2; – styfle

+2

@styfle: 'with'はサブクエリと似ていますが、それはinside-outではなくtop-downで書かれています。特定のシナリオで読みやすくすることはできますが、機能的にはサブクエリAFAIKと同等です。 – mellamokb

1

これは、私は、その後の説明を投げるよ... 38秒でそれ

select id1, id2 
from friends 
union 
select id2, id1 
from friends 

ビートを行う必要があります。 aがbの友人であり、(a、b)として格納されている場合は、逆順(b、a)で列を選択するので、両方のバリエーションで結束結果が得られます。

連合=はすべて=がUnionができます使用して重複した結果

を続ける明確な
連合を行い、あなたに時々店(a、b)はas well as(B、A)と、このクエリはまだ二回しか組み合わせが表示されます、 ab方向とba方向の両方で。

+0

ありがとう!では、どのようにIDをユーザー名に置き換えるのですか? – styfle

+0

私はそれを考え出したと思う: 'ユーザー名、FriendName' ' FROM' 'AS u2.name AS u1.name SELECTを( ' UNION' F'友人FROM ' 、f.id1 f.id2'を選択 'SELECT f.id2、f.id1' ' FROM friends f) ' '右外側ユーザをu1上に置くu1.id = id1' '右外側ユーザに接続するu2id = id2;' – styfle