Вот эта идея. Как насчет имени от человека и списка с разделителями-запятыми всех лиц, с которыми они работали? Вот синтаксис в 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;
EDIT:
Вот еще один способ думать о проблеме (если моя интерпретация верно). Я не уверен, почему я не пошел в этом направлении. Вы ищете всех (отдельных) пар людей, которые работали вместе над проектом. Получение пар из такого списка - это самосоединение. Это приводит к следующему запросу: (. Вы можете добавить 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' –