2017-05-07 237 views
1

我有两个表T1和T2。 T1和T2之间有1:n的关系。MySQL:连接两次到同一个表,但不同的行

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与Active = 1
- 0在与Active = 0

在T2秩列保存T2 N个相应的行最终用户在应用程序UI中排序的值。

这是简单的查询我目前有:

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

它返回的结果集:

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

这样工作正常。

现在我想在同一个结果集的Active = 0和MIN(等级),以获得该行的值:

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

我有第二JOIN发挥各地,使用子查询,使用GROUP BY和HAVING,但无济于事。

请注意,上述代码片段可以复制到http://sqlfiddle.com,并将工作。

+0

聚合值的行@RiggsFolly这不是数据透视表。 – GurV

+0

根据Gurwinder的问题,我的问题不是重复的(至少不是链接到的)。 – Eliott

回答

2

尝试使用其他左连接,这一次与t1_pk秩的最低活性= 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