在my-sql中加入多个表

时间:2009-10-05 11:35:25

标签: mysql

父表

ID EMP_ID EMP_NAME

1 emp01 Sam

2 emp02 Jam

3 emp03 Mam

儿童表1

ID EMP_ID EMP_ADDRESS

1 1 A Street

2 1 B Street

3 2 Z Street

4 3 L Street

5 3 M Street

6 3 N Street

儿童表2

ID EMP_ID EMP_PHONE

1 1 123456789

2 1 456789123

3 3 456987321

4 3 465987321

5 3 321651213

如果我将输入作为'emp01'传递,我需要从父表和子表中获取所有信息

父表ID和子emp_id形成外键关系

如何实现这一目标?

4 个答案:

答案 0 :(得分:2)

select p.ID,
       p.Emp_ID,
       p.Emp_Name,
       c1.Emp_address,
       c1.Emp_id,
       c1.id,
       c2.Emp_Phone,
       c2.Emp_id,
       c2.id
   FROM 
      parent p
      LEFT JOIN child1 c1 ON c1.id = p.id
      LEFT JOIN child2 c2 ON c2.id = p.id
   WHERE p.Emp_ID ='emp01';

****编辑**

select p.ID,
           GROUP_CONCAT(c2.Emp_Phone)
       FROM 
          parent p
          LEFT JOIN child1 c1 ON c1.id = p.id
          LEFT JOIN child2 c2 ON c2.id = p.id
       WHERE p.Emp_ID ='emp01'
        GROUP BY p.Emp_ID;

答案 1 :(得分:1)

通常:

select f1,f2,f3 from t1,t2,t3 where t1.x = t2.y and t1.x = t3.y

答案 2 :(得分:1)

是的,但你会根据子表中的多个条目获得重复信息(通过笛卡尔结果)

select a1.ID,
       a1.Emp_ID,
       a1.Emp_Name,
       b1.Emp_Address,
       b1.Emp_Phone
   from 
      EmployeeTable a1,
      AddressTable b1,
      PhoneTable c1
   where 
          a1.Emp_ID = {your parameter ID value}
      and a1.ID = b1.Emp_ID
      and a1.ID = c1.Emp_ID;

因此,如果一名员工拥有2条地址线和2个电话号码,则会在查询中返回4行...

ID 1,地址1,电话1 ID 1,地址1,电话2 ID 1,地址2,电话1 ID 1,地址2,电话2

答案 3 :(得分:0)

有两种方法可以做到这一点:

select emp_name, emp_address, emp_phone
from   t1, t2, t3
where  t1.id = t2.emp_id and
       t1.id = t3.emp_id;

select emp_name, emp_address, emp_phone
from   t1
join   t2 on (t2.emp_id = t1.id)
join   t3 on (t3.emp_id = t1.id);

它们都是相同的优化,所以除了第二种形式也适用于左连接之类的东西之外,没有任何理由可以优先选择其他形式。

但请参阅@Drapp对笛卡尔联合的谨慎态度。将地址和电话号码放在单独的表中的全部原因是,您可以为单个员工提供多个地址和电话号码,这样做会产生多种结果。