SQL复杂的GROUP BY在两个字段中的任何一个上

时间:2014-12-03 19:27:00

标签: mysql

说我有这样的关系(表格):

 name | mother | father
------+--------+--------
  joe |    sue |    ted
 lisa |    sue |    ted
  ron |    sue |   john
 jose |  maria | javier
 ...  many more items

假设名称是全球唯一的。我怎么组(joe,lisa,ron) 作为一个集合,基于组的定义作为共享的任何行 无论是母亲还是父亲?

MySQL或PostgreSQL的SQL都可以。

2 个答案:

答案 0 :(得分:2)

你可以做的一件事就是用一个存在的条件来比较母亲或父亲,并给它一个限制,说不仅仅有一个母亲或父亲。

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
)

<强> DEMO

编辑:

你可以将每个小组分开来的方式是这样的

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

ANOTHER DEMO

答案 1 :(得分:1)

无法按照描述完成。

让我们画一幅画。这里有4个父母和3个孩子:

M1  F1  M2  F2
 \  /\  /\  / 
  C1  C2  C3

考虑包含C1的组。该组还包含C2,作为半兄弟。

由于该组包含共享父项的所有子项,因此该组必须包含C3,因为C2和C3共享父项。

但由于该组仅包含至少共享一个父项的子项,因此该组不能包含C3,因为C1和C3不共享任何父项。

根据定义,C3必须同时包含和不包含。所以似乎这样的小组是不可能的。