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希望为多个组显示什么?”罗恩有一个不同的父母组合,那么为什么罗恩会在这个群体中呢?这个群体是那些共享母亲或父亲的孩子。罗恩有同一个母亲,所以他在。(即本