2012-10-01 213 views
1

我很困惑如何在MySQL中編寫以下查詢:給定一個協作者,我想讓所有參與此協作者工作的每個項目的協作者。MySQL查詢匹配多個字段?

這裏是我的合作者表:

id collaborator_id item_id 
1  1    1 
2  2    1 
3  3    1 
4  4    2 
5  1    2 
6  2    3 

爲collaborator_id = 1,查詢將返回:

collaborator_id item_id 
     1    1 
     2    1 
     3    1 
     1    2 
     4    2 

所以collaborator_id = 1 collaborator_ids工作= 2,3上ITEM_ID = 1和工作由item_id = 2自己。

這似乎超級簡單,但我有一個腦凍結如何獲得這些結果。思考?

+0

如何對我的回答如下? –

回答

5

此查詢連接的ITEM_ID,並讓你所有的唯一合作者誰共享項目與給定的合作者的工作,比合作者自己其他:

SELECT distinct b.collaborator_id, b.item_id 
FROM collab_table a 
    JOIN collab_table b 
    on a.item_id = b.item_id 
WHERE a.collaborator_id = 1 
    and b.collaborator_id != 1 
+0

- @ davesnitty,我如何返回'item_id'呢? –

+0

@timpeterson只是編輯查詢來做到這一點。假設合作者在> 1項目上進行協作,現在您可能每個合作者都有多行。 – davesnitty

+0

嗯,你的查詢不太對。它回來了:http://i.imgur.com/W9aOY.png –

2

你需要做的是加入的表背本身,使用的別名之一的過濾器,並拉動的結果與其他設置:

select a.COLLABORATOR_ID, a.ITEM_ID 
from COLLABORATOR as a 
inner join COLLABORATOR as b on 
    a.ITEM_ID = b.ITEM_ID 
where b.COLLABORATOR_ID = 1 
3

可以使用subquery

SELECT * 
FROM collaborator 
WHERE item_ID IN 
(
    SELECT item_ID 
    FROM collaborator 
    WHERE collaborator_id = 1 
) 
ORDER BY item_ID, Collaborator_ID 

或使用JOIN

SELECT a.* 
FROM COLLABORATOR a 
     JOIN COLLABORATOR b 
      ON a.ITEM_ID = b.ITEM_ID 
WHERE b.COLLABORATOR_ID = 1 
ORDER BY item_ID, Collaborator_ID; 

SQLFiddle Demo

+1

- @ JohnWoo,真棒謝謝! –

+0

- @ JohnWoo,我剛剛跑過@ davesnitty的代碼和你的代碼,他的代碼平均需要0.6ms,而你的代碼需要2ms。你看到你的代碼比Dave的速度快嗎(比如在一個龐大的百萬行合作者表上)?我接受你的答案B/C對我來說更有意義,但顯然我想選擇性能最高的代碼。思考? –

+1

選擇最適合您的答案:D –