2011-07-17 101 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