左自连接 return 每 'primary' 一行

Left Self Join return one row per 'primary'

我有一个 table 看起来像这样:

Rel_Id  Last    First   Relation
1   Jones   John    Primary
1   Jones   Mary    Spouse
1   Jones   Carl    Dependent
2   Will    Bill    Primary
3   Fine    Howard  Primary
4   Smith   Diana   Primary
4   Smith   Axel    Spouse

我正在尝试 return 所有 "Primary" 关系,每行一个,但如果有配偶,则将配偶包括在同一行。

我想要实现的结果如下所示:

1   Jones   John    Primary Jones   Mary    Spouse
2   Will    Bill    Primary null    null    null
3   Fine    Howard  Primary null    null    null
4   Smith   Diana   Primary Smith   Axel    Spouse

或者这样也行:

1   Jones   John    Primary Jones   Mary    Spouse
2   Will    Bill    Primary Will    Bill    Primary
3   Fine    Howard  Primary Fine    Howard  Primary
4   Smith   Diana   Primary Smith   Axel    Spouse

这是我的查询:

SELECT
P.Rel_Id,
P.Last,
P.`First`,
P.Relation,
S.Last AS sLast,
S.`First` AS sFirst,
S.Relation AS sRelation
FROM
relations AS P
LEFT JOIN relations AS S ON S.Rel_Id = P.Rel_Id
WHERE P.Relation = 'Primary' 
AND S.Relation <> 'Dependent'

以上查询结果为:

1   Jones   John    Primary Jones   John    Primary
1   Jones   John    Primary Jones   Mary    Spouse
2   Will    Bill    Primary Will    Bill    Primary
3   Fine    Howard  Primary Fine    Howard  Primary
4   Smith   Diana   Primary Smith   Diana   Primary
4   Smith   Diana   Primary Smith   Axel    Spouse

不幸的是,我的查询在正确排除“Dependent”的同时显示了两行唯一 'Primary' 成员,其中有一个配偶,我不想要。我如何 return 每个 'Primary' 只和配偶有关系吗?

您需要在联接条件中的查询中添加一个额外的检查,以便不显示两个主节点,只显示配偶。

所以在查询中也加上这个条件:

S.Relation <> P.Relation

因此最终查询将变为:

SELECT
P.Rel_Id,
P.Last,
P.`First`,
P.Relation,
S.Last AS sLast,
S.`First` AS sFirst,
S.Relation AS sRelation
FROM
relations AS P
LEFT JOIN relations AS S ON S.Rel_Id = P.Rel_Id AND S.Relation <> P.Relation
WHERE P.Relation = 'Primary' 
AND S.Relation <> 'Dependent'

希望对您有所帮助。

SELECT  GROUP_CONCAT(CONCAT_WS(' ',
                               last, first, relation),
                     SEPARATOR ' -- '
                     ORDER BY IF(relation = 'PRIMARY', 0, rel_id)
        ) AS Family
    FROM relations
    GROUP BY last;

它不会像您要求的那样给您 "columns",但它可能会。

这将处理任何人数的家庭。但是,这取决于 last 是唯一的。 (这是您的架构设计中存在的缺陷。)

last 分开可能更好:

SELECT  last,
        GROUP_CONCAT(CONCAT_WS(' ',
                               first, relation),
                     SEPARATOR ' -- '
                     ORDER BY IF(relation = 'PRIMARY', 0, rel_id)
        ) AS Family
    FROM relations
    GROUP BY last;

现在这看起来很明显 - 而且很简单! (谢谢大家 - 真的)

SELECT
P.Rel_Id,
P.Last,
P.`First`,
P.Relation,
S.Rel_Id AS sRel_Id,
S.Last AS sLast,
S.`First` AS sFirst,
S.Relation AS sRelation
FROM
relations AS P
LEFT JOIN relations AS S ON S.Rel_Id = P.Rel_Id and S.Relation = 'Spouse'
WHERE P.Relation = 'Primary'