2014-01-31 129 views
1

我有一個MySQL問題。它與this other question that I asked previously有關,但略有不同。MySQL查詢加入

我有2個表:團隊,承包商

TEAMS 
|team_id | location| 
-------------------- 
| 1 | space1 | 
-------------------- 
| 2 | space2 | 
-------------------- 
| 3 | space3 | 
-------------------- 
| 4 | space3 | 
-------------------- 

CONTRACTORS 
|cont_id | location| team_id| 
----------------------------- 
| 1 | space1 | 1 | 
----------------------------- 
| 2 | space1 | 0 | 
----------------------------- 
| 3 | space3 | 3 | 
----------------------------- 
| 4 | space3 | 3 | 
----------------------------- 
| 5 | space3 | 0 | 
----------------------------- 
| 6 | space3 | 4 | 
----------------------------- 

如果我給出一個TEAM_ID,我想創建一個將找到所有在該位置的承包商查詢給定的team_id並且只屬於給定的team_id或team_id = 0。 (承包商表中的team_id = 0意味着承包商目前不是團隊的一部分)。

例如,我給了team_id = 3.team_id = 3的團隊位於space3。我想查找位於space3的承包商,僅屬於team_id = 3team_id = 0(本例中cont_id = 3,4,5)。

有沒有一種方法可以通過單個MySQL查詢來實現這一點?

+0

我已經更新了我的答案是指它 –

+0

5的TEAM_ID是0,而不是3,有錯誤的查詢,我的工作正常.. !!! –

+0

我已經更新了我的回答引用 –

回答

0
Select cont_id,team_id,location 
FROM CONTRACTORS 
where team_id = 3 or 
     team_id =0 and 
     location In 
       (
        SElect location 
        from TEAMS 
        where team_id=3 
       ) 

Working Fiddle

輸出:

enter image description here

隨着加入你可以做這樣

SELECT C.cont_id ,C.team_id,T.location 
FROM TEAMS T 
LEFT JOIN CONTRACTORS C 
ON T.location = C.location 
AND (T.team_id = C.team_id OR C.team_id = 0) 
where T.team_id= 3 

Working Fiddle

輸出:

enter image description here

+1

謝謝你的幫助。這根據需要工作。我不知道你可以做嵌套查詢。我將不得不閱讀關於這個。再次感謝。 – brybott

+0

@coolo你爲什麼要爲錯誤的答案標記? –

+0

@但看到隊伍返回3但實際上是0對嗎? –

2

嘗試像這樣

SELECT C.cont_id ,T.team_id,T.locations 
FROM TEAM T 
LEFT JOIN CONTRACTORS C ON T.team_id = C.team_id OR C.team_id = 0 
WHERE T.team_id = 3 
+0

ON子句需要使用OR而不是AND,否則這將是我的選擇。 – Kickstart

+0

謝謝你的幫助。使用AND,結果是一帆風順的。當使用OR作爲Kickstart建議時,它給了我cont_id = 2,3,4,5。所以它給了我team_id = 0的所有承包商。我正在尋找給定團隊的承包商,以及那些在同一地點但沒有團隊的承包商。 – brybott

2

試試這個:

select cont_id, c.team_id, c.location 
from CONTRACTORS c join TEAM t 
on c.team_id = t.team_id 
where c.team_id = GIVEN_TEAM_ID or c.team_id = 0 
+0

謝謝你的幫助。當我嘗試這個時,它沒有給我任何team_id = 0的承包商。 – brybott

1

替代避免子查詢: -

SELECT C.cont_id ,T.team_id,T.location 
FROM TEAMS T 
LEFT JOIN CONTRACTORS C 
ON T.location = C.location 
AND (T.team_id = C.team_id OR C.team_id = 0) 
WHERE T.team_id = 3 

http://www.sqlfiddle.com/#!2/b9efd/1

+0

正確的,這個工作還需要。 – brybott

+1

for 5 the team_id is 0 and not 3,there is wrong in the query,mine works fine .. –

+1

對於cont_id = 5,team_id是0而不是3.你的回答不正確 –