2017-05-07 17 views
1

私はT1とT2の2つのテーブルを持っています。 T1とT2の間には1:nの関係があります。MySQL:同じテーブルでも異なる行に2回リンクする

CREATE TABLE T1 (
    PK INT 
    /* more columns here */ 
); 

CREATE TABLE T2 (
    PK INT, 
    T1_PK INT, 
    Active INT, 
    Rank INT 
    /* more columns here */ 
); 

INSERT INTO T1 VALUES (1); 
INSERT INTO T1 VALUES (2); 
INSERT INTO T1 VALUES (3); 

INSERT INTO T2 VALUES (1, 1, 1, 20); 
INSERT INTO T2 VALUES (2, 1, 0, 15); 
INSERT INTO T2 VALUES (3, 1, 0, 10); 
INSERT INTO T2 VALUES (4, 1, 0, 5); 

INSERT INTO T2 VALUES (5, 2, 1, 16); 
INSERT INTO T2 VALUES (6, 2, 0, 11); 
INSERT INTO T2 VALUES (7, 2, 0, 6); 

INSERT INTO T2 VALUES (8, 3, 1, 7); 

したがってT1の各行が持つ:
- アクティブ= 1
とT2における1対応する行 - アクティブ= 0

とT2の行に対応するnは0〜T2でランク列が成立アプリケーションのUIでのエンドユーザーソートの値。

これは私が現在持っている単純なクエリです:

PK  Active Rank 
1  1  20 
2  1  16 
3  1  7 

ので、正常に動作している:それは、この結果セットを返す

SELECT T1.PK, T2.Active, T2.Rank 
    FROM T1 
LEFT JOIN T2 ON T1.PK = T2.T1_PK 
    WHERE T2.Active = 1 

今は同じ結果セットに0 =アクティブ及びMIN(ランク)と行の値を取得したい:私は第二BYグループと、サブクエリと、JOINの周り再生

PK  Active Rank Active Rank 
1  1  20  0  5 
2  1  16  0  6 
3  1  7  null null 

そしてHAVING、しかし役に立たない。

上記のコードはhttp://sqlfiddle.comにコピーでき、動作することに注意してください。

+0

で行のランクの最小とt1_pkの集計値と結合し、この時間別の左を使用してみてください。 – GurV

+0

私の質問は重複していませんでした(少なくともリンクされているものではありません)。 – Eliott

答えて

2

は@RiggsFollyこれは、ピボットテーブルではないアクティブ= 0

select t1.pk, 
    t2.active, 
    t2.rank, 
    0 as active_0, 
    t.rank as min_rank_0 
from t1 
left join t2 on t1.pk = t2.t1_pk 
    and t2.active = 1 
left join (
    select t1_pk, 
     min(rank) as rank 
    from t2 
    where active = 0 
    group by t1_pk 
    ) t on t1.pk = t.t1_pk; 

Demo

関連する問題