2013-05-30 47 views
1

我知道SQL的基礎知識,但對於一個項目,我需要執行以下操作並將其阻止。 我有兩個表:sql根據第二個表檢索相關記錄

ID | NAME 

和項目

ID | PersonID | ProjectID 

在項目表可能是同一個專案編號是4條記錄一次爲每個人。 我想要一個包含Person中所有名稱的列表以及他們在一個Project中一起工作的所有名稱。

所以,如果我有一定的人(即編號73571),我已經拿出來:

SELECT DISTINCT person.name 
FROM person INNER JOIN project on person.id=project.personid 
WHERE project.id IN (
    SELECT id FROM project WHERE id=73571) 
ORDER BY person.name; 

我如何能做到這一點,爲Person表的所有記錄工作?

+1

你能否提供一些示例輸出?當一個項目有很多人並且一個人有很多項目時,輸出應該是什麼樣子? –

+0

喜歡的東西: PERSON1 - Coworker1 PERSON1 - Coworker2 PERSON2 - ... – serkef

+0

我猜'WHERE ID = 73571'應該是'WHERE PERSONID = 73571' –

回答

0

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

+0

感謝您的回答。我需要一段時間才能嘗試,我會發布。 – serkef

+0

它變長了,我想這會花更長的時間。我的桌子有幾十萬行。 – serkef

+0

哇這個作品很棒,我猜@Ochi也是。非常感謝:) – serkef

0

簡單的查詢

select pro.projectid 
     ,per.name 
     ,trim(BOTH ',' FROM replace(GROUP_CONCAT(per.name SEPARATOR ','), per.name, '')) as coworkers 
from person as per, 
    project as pro 
where per.id = pro.personid 
group by pro.projectid 

projectid  name   coworkers 
1    person1  person2,person3,person4 
2    person2  person4 
3    person3  person4,person5 

-- for pairs 
    SELECT pro.projectid, per.name, co.name 
    FROM project pro 
     LEFT JOIN project pro2 on (pro.projectid = pro2.projectid and pro.personid <> pro2.personid) 
     LEFT JOIN person per on pro.personid = per.id 
     LEFT JOIN person co on pro2.personid = co.id 
ORDER BY pro.projectid ASC, per.name ASC, co.name ASC 
+0

這工作順利和快速。我怎樣才能讓結果像person1-coworker1,person1-coworker2,每個都在不同的行中? – serkef

+0

對新版本 - 哦...只是看到它:它是一樣的@戈登的:) – Ochi

相關問題