2012-02-02 16 views
0

私は、idnameという友人と呼ばれるテーブルと、friend_idとfriend2_idを含む関係を格納するfriendshipという自己結合テーブルを持っています。特定のfrndの名前が与えられた場合 は、どのように私は、関連する友人の名前を取得します自己結合によるMYSQL自己参照ロジック

id name 
1 jack 
2 kurt 
3 jim 

ので、私は私がjimを取得する必要があります「jack」与えれば

friendship 
f_id f1_id 
1 3 

戻る

+0

'some_other_name' AS friend_names_table登録しよう:あなたが友情テーブルに名を追加するかどう

は、それはあなたの例えばjoingsの多くを保存します。また、あなたがすでに試したものを見せてください。 – Piskvor

+0

[テーブルへの自己結合]の可能な複製(http://stackoverflow.com/questions/3035105/self-join-to-a-table) – Piskvor

答えて

0

これは、実行する操作に応じて1つのクエリまたは2つのクエリで実行できます。

シンプルなものが考えられます。

SELECT 
    f_id, 
    f1_id 
FROM 
    friendship 
WHERE 
    f_id=1 
    OR 
    f1_id=1 

そしてあなたのような文を使用して、特定の友人を得ることができます。

SELECT name FROM people WHERE id IN(2,3) 

代替が参加し、自己であるが、ここではハードの部分は、あなたのことですidはf_idとf1_idの両方にあるので、UNIONコマンドなどが必要です(未テスト)。

SELECT 
    p1.name, 
    p2.name, 
FROM 
    friendship 
    INNER JOIN 
    people AS p1 
     ON friendship.f_id = people.id 
    INNER JOIN 
    people AS p2 
     ON friendship.f1_id = people.id 
WHERE 
    p1.id=1 OR p2.id=1 

膨大な量のレコードにかなり重いため、これらのオプションの速度を徹底的にチェックします。あなたがより多くのパフォーマンスを必要とする場合は、いくつかの選択肢を試してください。たとえば、常に最小のpeople.idをf_idに入れ、大きなものをf1_idに入れた場合、2つのクエリを実行して結合することができます。代わりに、それらを頻繁に必要とする場合、小さなビットを非正規化して結果をキャッシュすることです。

SELECT 
    f_id, 
    f1_id, 
    f_name, 
    f1_name 
FROM 
    friendship 
WHERE 
    f_id=1 
    OR 
    f1_id=1