0

2 人の友人関係を含むテーブルを設計したいので、次のフィールドを含むテーブルを設計しました: FriendId, Friend_L,Friend_R

Frind_Lこれは、その人がその人の友達であることを意味しますFriend_R

しかし、この設計には、次のクエリを使用して特定の人物の友人を特定する機能を持たせるために、すべての友人関係をテーブルに 2 回追加する必要があるという問題があります。

SELECT Friend_R
FROM Friends
Where Friend_L= ANY INTEGER ;

すべての関係を複製せずにそれを行う他のアイデアはありますか?

4

3 に答える 3

1

別のクエリを使用してみますか?

 SELECT
  Friend_R as Friend
 FROM
  Friends
 WHERE
  Friend_L = :x
UNION
 SELECT
  Friend_L as Friend
 FROM
  Friends
 WHERE
  Friend_R = :x

最初のものはあなたのものと同じですが、他のクエリとの UNION はすべての代替結果を返す必要があります。UNION (ALL なし) は、重複の削除も処理します。

または、本当に必要な場合は、CASEを使用して1つにすることもできます...

SELECT
 CASE WHEN (Friend_L = :x) THEN Friend_R ELSE Friend_L END AS Friend
FROM
 Friends
WHERE
 Friend_L = :x OR Friend_R = :x
于 2013-07-10T20:54:08.393 に答える
0

2 回追加する必要はありません。一度追加して使用するだけUNIONです:

SELECT Friend_R FROM Friends Where Friend_L= ANY INTEGER
UNION
SELECT Friend_L FROM Friends Where Friend_R= ANY INTEGER
于 2013-07-10T20:52:46.593 に答える
0

あなたはそれをする必要はありません。ID が 20 のユーザーとの関係を探しているとします。

SELECT *
FROM friends
WHERE left_id = 20 or right_id = 20;
于 2013-07-10T20:51:14.897 に答える