左自连接 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'
我有一个 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'