2017-11-20 22 views
0

私はこれを最初に行う必要はないと確信していますが、ニュアンスを考慮した同様の質問は見つかりませんでした。異なるテーブルの結果をグループ別にグループ化する

userid | label | rank | 
================================= 
1  | red  | 1 
1  | green  | 2 
1  | orange  | 3 
2  | blue  | 1 
2  | red  | 2 
... 

各テーブルには、ユーザーID、が、いくつかのあたり最大で3つの項目があります:

は、私はすべてが同様のパターンに従うことを3つのテーブル(fav_foodfav_color、およびfav_place)を持っていますユーザーは3未満であり、他のユーザーは特定の表に対してはを持たない可能性があります。すなわち、ユーザ10は、2つのお気に入りの色、1つのお気に入りの食品、および0つのお気に入りの場所を有する可能性がある。

私のような出力私のデータがそうすることができ、クエリを探しています

userid | fav_food | fav_place | fav_color | rank 
=========================================================== 
1  | pizza  | New York | red   | 1 
1  | burgers  | NULL  | green  | 2 
1  | NULL  | NULL  | orange  | 3 
2  | tacos  | Chicago  | blue  | 1 
2  | burgers  | Orlando  | red   | 2 
... 

は基本的に、すべてが一緒に2つの項目をランク付けし、一緒に1つの項目をランク付けし、そして一緒に3つの項目をランク付けし(NULLがのない項目はなかったですそのランクは存在する)。

アプリケーション層で3つの別々のクエリ(各テーブルに1つずつ)+後処理を使用して動作させることができましたが、私の個人的な知識ベースのために、どのようにそれを行うかを知っていたのでしょうか単一のクエリ。

多くの感謝!

+0

FULL OUTER私のタプルのすべての組み合わせの結果セットを与えるために起こっているPM77-1 @ユーザーIDとランク –

+0

ON登録しようが、私はさらにヌルを考慮しながら、ランクを照合することによってそれを軽減する必要があるだろうか? – isick

答えて

0

@Isick、あなたがLEFT OUTERでこれを行うことができ

だけでユーザーIDとランクを含むテーブルに各テーブルの上に登録しよう。 DEMO

select user_rank.userid, user_rank.rank, f.food, p.place, c.color from 
(
    select userid, rank from fav_food 
    union 
    select userid, rank from fav_place 
    union 
    select userid, rank from fav_color 
    ) user_rank 
left outer join 
(select userid, rank, label as food from fav_food) f 
on user_rank.userid = f.userid and user_rank.rank = f.rank 
left outer join 
(select userid, rank, label as place from fav_place) p 
on user_rank.userid = p.userid and user_rank.rank = p.rank 
left outer join 
(select userid, rank, label as color from fav_color) c 
on user_rank.userid = c.userid and user_rank.rank = c.rank 
order by userid, rank 
+0

あなたの感謝しています。内側の照会+共用体がキーでした。私はランクとテーブルをヌルフィルとMAX()でランク付けしてグループ化しました。あなたの反応は非常に高く評価されます。ありがとうございました! – isick

関連する問題