這是一個想法。來自個人的姓名和所有與他們一起工作過的人的逗號分隔列表如何?這裏是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' –