1

我对如何在 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 在 item_id=1 上与 collaborator_ids=2,3 一起工作,并在 item_id=2 上自己工作。

这看起来超级简单,但我对如何获得这些结果一无所知。想法?

4

3 回答 3

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
于 2012-10-01T01:22:53.680 回答
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 演示

于 2012-10-01T01:45:31.843 回答
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
于 2012-10-01T01:25:26.300 回答