2011-07-17 131 views
0

假設多個(2個以上)表I具有4個表:MySQL的加入與條件

表1:Task

ID  Task   Schedule 
1  Cut Grass   Mon 
2  Sweep Floor  Fri 
3  Wash Dishes  Fri 

表2:Assigned

ID  TaskID (FK)  PersonID (FK) 
1   1    1 
2   1    2 
3   2    3 
4   3    2 

表3:Person

ID  Name 
1  Tom 
2  Dick 
3  Harry 

表4:Mobile

ID  PersonID (FK)  CountryCode  MobileNumber 
1   1     1   555-555-5555 
2   2    44   555-555-1234 
3   3    81   555-555-5678 
4   3    81   555-555-0000 

我想在某一天顯示

  1. 任務
  2. 分配人姓名的人說:
  3. 到任務
  4. 電話號碼

我覺得應該是像下面這樣,但我也不太清楚如何設置的條件,這樣的結果是正確的限制:

SELECT T.ID, T.Task, P.Name, M.MobileNumber 
FROM Task AS T 
LEFT JOIN Assigned AS A 
    ON T.ID = A.TaskID 
LEFT JOIN Person AS P 
    ON A.PersonID = P.ID 
LEFT JOIN Mobile AS M 
    ON M.PersonID = P.ID 
WHERE T.Schedule = Fri 

我的目標是獲取以下信息(它會顯示不同):

Tasks      Name    MobileNumber 
Sweep Floor, Wash Dishes  Dick, Harry  44-555-555-1234, 81-555-555-5678, 81-555-555-0000 

當然,如果JOIN是這樣做的錯誤方式,請說出來。

回答

1

目前還不清楚你想在這種情況下,重複數據做什麼,而是你應該考慮使用內部聯接,而不是外部連接,並使用類似GROUP_CONCAT()的電話號碼結合起來。

+0

爲什麼內部連接vs外部連接?如果目前沒有人被分配到任務中,這是否意味着我不會得到任何結果? – user928984

+0

然後,您需要在任務分配加入上進行外連接。您可能還需要在人員移動連接上進行外部連接(以吸引沒有手機的人員)。但是對於Assign-Person,內部聯接就足夠了(除非'Assign.PersonID'字段可以爲空。) –

+0

@ypercube謝謝,但是由於可空字段,我最終使用了所有外部聯接。另外,如果有人感興趣,我最終使用了'IFNULL()'和'GROUP_CONCAT'部分。此外,布賴恩阿爾維斯,感謝您使用「GROUP_CONCAT」 – user928984