2017-03-09 7 views
0

私のテーブルをマージ:2つの列が1つになり、他の列は維持されます。その後、別のテーブルで

//    friendships 
+-----------------+-----------------+-----------------+ 
|  fid  |  person1  |  person2  | 
|-----------------+-----------------|-----------------+ 
+-----------------+-----------------+-----------------+ 
|  1   | personid  | personid  | 
|-----------------+-----------------|-----------------+ 
|  2   | personid  | personid  | 
|-----------------+-----------------|-----------------+ 

//    persons 
+-----------------+-----------------+-----------------+ 
|  pid  |  firstname |  lastname | 
|-----------------+-----------------|-----------------+ 
+-----------------+-----------------+-----------------+ 
|  1   | name   | name   | 
|-----------------+-----------------|-----------------+ 
|  2   | name   |  name  | 
|-----------------+-----------------|-----------------+ 

1)私は、特定のPERSONIDが含まれている友情テーブルのすべての行を取得したいです。このidは、person1またはperson2列のいずれかになります。 fid列が保存されるべきであるが、person列が一つだけ、例えば:

Select fid, person1 as person, person2 as person FROM friendships 
WHERE person1 = some_personid 
OR person2 = some_personid; 

(このクエリから2つの列が一つだけであるべきである)であるべきです。それ、どうやったら出来るの?

2)ステップ1の結果の人テーブルに参加したいON fid.person = persons.pid

+0

友情関係は対称ですか?私はAがBの友人であり、AのBの友人でもあるということですか? –

答えて

1

私が正しく理解している場合、この人物がperson1またはperson2のいずれであるかにかかわらず、希望する人物のすべての友人の名と姓が必要です。その場合

、友好関係がperson2の下で希望者を持つすべての行がありますので、その、クエリは、はるかに簡単対称である場合は、サブクエリ

select * 
from persons p 
join (
      select fid, person1 as person, person2 as otherPerson 
      from friendship 
      where person1 = 'yourPerson' 
      union all 
      select fid, person2 as person, person1 as otherPerson 
      from friendship 
      where person2 = 'yourPerson' 
     ) f 
on p.pid = f.otherPerson 

であることを行うことができます対称でない場合person1の下に希望する人と対応する行。

select * 
from friendship f 
join person p 
on  f.person2 = p.pid 
where person1 = 'yourPerson' 
1

手順1では、Where句にOR句を使用して、どのレコードを保存するかを指定します。次に、選択したケースステートメントを使用して、どの人物を選択します。ステップ2については

select fid 
     , case person1 when some_personid then person1 else person2 end as person 
    from friendships 
    where (person1 = some_personid 
     or person2 = some_personid) 

、あなたは人の中から選択し、サブクエリを使用して、ステップ1から表に結合します。

select * 
    from persons p 
    inner join (
     select fid 
       , case person1 when some_personid then person1 else person2 end as person 
      from friendships 
      where (person1 = some_personid 
       or person2 = some_personid) 
    ) f on f.person = p.pid 

希望します。

関連する問題