Mysql 两个字段中任意一个字段上的SQL复杂分组依据
假设我有这样一个关系(表):Mysql 两个字段中任意一个字段上的SQL复杂分组依据,mysql,Mysql,假设我有这样一个关系(表): name | mother | father ------+--------+-------- joe | sue | ted lisa | sue | ted ron | sue | john jose | maria | javier ... many more items 假设名称是全局唯一的。我怎样才能分组(乔、丽莎、罗恩) 作为一个集合,基于组作为共享的任何行的定义 不是母亲就是父亲 MySQL或Po
name | mother | father
------+--------+--------
joe | sue | ted
lisa | sue | ted
ron | sue | john
jose | maria | javier
... many more items
假设名称是全局唯一的。我怎样才能分组(乔、丽莎、罗恩)
作为一个集合,基于组作为共享的任何行的定义
不是母亲就是父亲
MySQL或PostgreSQL的SQL都可以。您可以使用exists条件来比较母亲或父亲,并给它一个限制,即母亲或父亲不止一个
SELECT distinct name
FROM table p
WHERE EXISTS
( SELECT 1
FROM table p1
WHERE p1.mother = p.mother
LIMIT 1, 1
)
OR exists
( SELECT 1
FROM table p2
WHERE p2.father = p.father
LIMIT 1, 1
)
编辑:
你可以用这样的方法把每个小组分开
SELECT name, mother_father_group
FROM
( SELECT distinct
name, mother, father,
@groups := IF(@mother = mother OR @father = father, @groups, @groups + 1) as mother_father_group,
@mother := mother, @father := father
FROM upeople p, (SELECT @mother := "", @father := "", @groups := 0) temp
WHERE EXISTS
( SELECT 1
FROM upeople p1
WHERE p1.mother = p.mother
LIMIT 1, 1
)
OR exists
( SELECT 1
FROM upeople p2
WHERE p2.father = p.father
LIMIT 1, 1
)
)t
你可以做的一件事是使用exists条件来比较母亲或父亲,并给它一个限制,即母亲或父亲不止一个
SELECT distinct name
FROM table p
WHERE EXISTS
( SELECT 1
FROM table p1
WHERE p1.mother = p.mother
LIMIT 1, 1
)
OR exists
( SELECT 1
FROM table p2
WHERE p2.father = p.father
LIMIT 1, 1
)
编辑:
你可以用这样的方法把每个小组分开
SELECT name, mother_father_group
FROM
( SELECT distinct
name, mother, father,
@groups := IF(@mother = mother OR @father = father, @groups, @groups + 1) as mother_father_group,
@mother := mother, @father := father
FROM upeople p, (SELECT @mother := "", @father := "", @groups := 0) temp
WHERE EXISTS
( SELECT 1
FROM upeople p1
WHERE p1.mother = p.mother
LIMIT 1, 1
)
OR exists
( SELECT 1
FROM upeople p2
WHERE p2.father = p.father
LIMIT 1, 1
)
)t
你可以做的一件事是使用exists条件来比较母亲或父亲,并给它一个限制,即母亲或父亲不止一个
SELECT distinct name
FROM table p
WHERE EXISTS
( SELECT 1
FROM table p1
WHERE p1.mother = p.mother
LIMIT 1, 1
)
OR exists
( SELECT 1
FROM table p2
WHERE p2.father = p.father
LIMIT 1, 1
)
编辑:
你可以用这样的方法把每个小组分开
SELECT name, mother_father_group
FROM
( SELECT distinct
name, mother, father,
@groups := IF(@mother = mother OR @father = father, @groups, @groups + 1) as mother_father_group,
@mother := mother, @father := father
FROM upeople p, (SELECT @mother := "", @father := "", @groups := 0) temp
WHERE EXISTS
( SELECT 1
FROM upeople p1
WHERE p1.mother = p.mother
LIMIT 1, 1
)
OR exists
( SELECT 1
FROM upeople p2
WHERE p2.father = p.father
LIMIT 1, 1
)
)t
你可以做的一件事是使用exists条件来比较母亲或父亲,并给它一个限制,即母亲或父亲不止一个
SELECT distinct name
FROM table p
WHERE EXISTS
( SELECT 1
FROM table p1
WHERE p1.mother = p.mother
LIMIT 1, 1
)
OR exists
( SELECT 1
FROM table p2
WHERE p2.father = p.father
LIMIT 1, 1
)
编辑:
你可以用这样的方法把每个小组分开
SELECT name, mother_father_group
FROM
( SELECT distinct
name, mother, father,
@groups := IF(@mother = mother OR @father = father, @groups, @groups + 1) as mother_father_group,
@mother := mother, @father := father
FROM upeople p, (SELECT @mother := "", @father := "", @groups := 0) temp
WHERE EXISTS
( SELECT 1
FROM upeople p1
WHERE p1.mother = p.mother
LIMIT 1, 1
)
OR exists
( SELECT 1
FROM upeople p2
WHERE p2.father = p.father
LIMIT 1, 1
)
)t
无法按所述操作 让我们画一幅画。以下是4位家长和3位孩子:
M1 F1 M2 F2
\ /\ /\ /
C1 C2 C3
考虑包含C1的组。该组还包含C2,作为半同胞
由于该组包含共享父级的所有子级,因此该组必须包含C3,因为C2和C3共享父级
但是,由于此组仅包含共享至少一个父级的子级,因此此组不能包含C3,因为C1和C3不共享任何父级
根据定义,C3必须同时包含和不包含。因此,这样的一个小组似乎是不可能的。无法按上述方式完成 让我们画一幅画。以下是4位家长和3位孩子:
M1 F1 M2 F2
\ /\ /\ /
C1 C2 C3
考虑包含C1的组。该组还包含C2,作为半同胞
由于该组包含共享父级的所有子级,因此该组必须包含C3,因为C2和C3共享父级
但是,由于此组仅包含共享至少一个父级的子级,因此此组不能包含C3,因为C1和C3不共享任何父级
根据定义,C3必须同时包含和不包含。因此,这样的一个小组似乎是不可能的。无法按上述方式完成 让我们画一幅画。以下是4位家长和3位孩子:
M1 F1 M2 F2
\ /\ /\ /
C1 C2 C3
考虑包含C1的组。该组还包含C2,作为半同胞
由于该组包含共享父级的所有子级,因此该组必须包含C3,因为C2和C3共享父级
但是,由于此组仅包含共享至少一个父级的子级,因此此组不能包含C3,因为C1和C3不共享任何父级
根据定义,C3必须同时包含和不包含。因此,这样的一个小组似乎是不可能的。无法按上述方式完成 让我们画一幅画。以下是4位家长和3位孩子:
M1 F1 M2 F2
\ /\ /\ /
C1 C2 C3
考虑包含C1的组。该组还包含C2,作为半同胞
由于该组包含共享父级的所有子级,因此该组必须包含C3,因为C2和C3共享父级
但是,由于此组仅包含共享至少一个父级的子级,因此此组不能包含C3,因为C1和C3不共享任何父级
根据定义,C3必须同时包含和不包含。因此,这样的一个群体似乎是不可能的。好吧,我想我的答案不会给出你所看到的答案。删除它。你能发布你希望看到的结果吗?如果有第三个孩子尼克,母亲=玛丽亚父亲=约翰,尼克会和乔、丽莎、罗恩在同一组吗?(那么何塞也会在小组中吗?)@Andras让我们规定这种情况(尼克)永远不会发生。好吧,我想我的答案不会给出你所看到的答案。删除它。你能发布你希望看到的结果吗?如果有第三个孩子尼克,母亲=玛丽亚父亲=约翰,尼克会和乔、丽莎、罗恩在同一组吗?(那么何塞也会在小组中吗?)@Andras让我们规定这种情况(尼克)永远不会发生。好吧,我想我的答案不会给出你所看到的答案。删除它。你能发布你希望看到的结果吗?如果有第三个孩子尼克,母亲=玛丽亚父亲=约翰,尼克会和乔、丽莎、罗恩在同一组吗?(那么何塞也会在小组中吗?)@Andras让我们规定这种情况(尼克)永远不会发生。好吧,我想我的答案不会给出你所看到的答案。删除它。你能发布你希望看到的结果吗?如果有第三个孩子尼克,母亲=玛丽亚父亲=约翰,尼克会和乔、丽莎、罗恩在同一组吗?(那么何塞也会在小组中吗?)@Andras让我们规定这种情况(尼克)永远不会发生。我希望比这更好。这不就是给你一张有兄弟姐妹的名单吗?这并没有将他们分组(可爱的把戏,使用限制1,1跳过自我btw)@Andras yep。。。正如我在评论中所问的,OP需要澄清他想要返回的内容。。。他想指定一个特定的母亲或父亲吗?他是不是只想把它们都列出来?OP希望为多个组显示什么?”罗恩有一个不同的父母组合,那么为什么罗恩会在这个群体中呢?这个群体是那些共享母亲或父亲的孩子。罗恩有同一个母亲,所以他在。(即本