说我有这样的关系(表格):
name | mother | father
------+--------+--------
joe | sue | ted
lisa | sue | ted
ron | sue | john
jose | maria | javier
... many more items
假设名称是全球唯一的。我怎么组(joe,lisa,ron) 作为一个集合,基于组的定义作为共享的任何行 无论是母亲还是父亲?
MySQL或PostgreSQL的SQL都可以。
答案 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
答案 1 :(得分:1)
无法按照描述完成。
让我们画一幅画。这里有4个父母和3个孩子:
M1 F1 M2 F2
\ /\ /\ /
C1 C2 C3
考虑包含C1的组。该组还包含C2,作为半兄弟。
由于该组包含共享父项的所有子项,因此该组必须包含C3,因为C2和C3共享父项。
但由于该组仅包含至少共享一个父项的子项,因此该组不能包含C3,因为C1和C3不共享任何父项。
根据定义,C3必须同时包含和不包含。所以似乎这样的小组是不可能的。