2012-10-01 5 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,6 мс, тогда как ваш занимает 2 мс. Вы видите, что ваш код когда-либо был быстрее, чем у Дейва (как на огромной, миллионной колонке соавторов)? Я принял ваш ответ b/c, это имело для меня больше смысла, но, очевидно, я бы выбрал наиболее эффективный код. Мысли? –

+1

выберите, что наилучшим образом соответствует вашему ответу всегда: D –

Смежные вопросы