这是一个想法。来自个人的姓名和所有与他们一起工作过的人的逗号分隔列表如何?这里是MySQL中的语法:
SELECT pp.p1, pp.p1.name, group_concat(distinct p2.name)
FROM (select p1.id as p1, p1.name as p1name, p2.id as p2, p2.name as p2name
from person p1 cross join
person p2
where p1.id <> p2.id
) pp join
project pr1
on pr1.personid = pp.p1 join
project pr2
on pr2.personid = pp.p2 and
pr2.id = pr1.id
group by pp.p1, pp.p1name;
这个想法从所有人对的主列表开始。然后,它加入第一个人的所有项目,以及第二个人的所有匹配项目。这些连接在一起,使用group concat
。
如果你是幸福的成对列表,这里是在SQL Server中运行的例子:
with person as (
select 1 as id, 'a' as name union all
select 2, 'b' union all
select 3, 'c' union all
select 4, 'd' union all
select 5, 'e'
),
project as (
select 1 as id, 1 as personid union all
select 1 as id, 2 as personid union all
select 1 as id, 3 union all
select 2, 4 union all
select 2, 5 union all
select 3, 1 union all
select 3, 5
)
SELECT distinct pp.p1name, pp.p2name
FROM (select p1.id as p1, p1.name as p1name, p2.id as p2, p2.name as p2name
from person p1 cross join
person p2
where p1.id <> p2.id
) pp join
project pr1
on pr1.personid = pp.p1 join
project pr2
on pr2.personid = pp.p2 and
pr2.id = pr1.id;
编辑:
这里是思考这个问题的另一种方式(如果我的解释是正确的)。我不知道为什么我没有先走这个方向。您正在寻找所有(不同的)在一个项目上一起工作的人。从这样的列表中获得配对是一种自我连接。这导致下面的查询:(您可以添加group_concat()
如果你喜欢把行到一个逗号分隔的列表)
SELECT distinct p1.name, p2.name
FROM project pr1 join
project pr2
on pr1.id = pr2.id and
pr1.personid <> pr2.personid join
person p1
on pr1.personid = p1.id join
person p2
on pr2.personid = p2.id;
你能否提供一些示例输出?当一个项目有很多人并且一个人有很多项目时,输出应该是什么样子? –
喜欢的东西: PERSON1 - Coworker1 PERSON1 - Coworker2 PERSON2 - ... – serkef
我猜'WHERE ID = 73571'应该是'WHERE PERSONID = 73571' –