Объединить несколько таблиц в my-sql - PullRequest
1 голос
/ 05 октября 2009

Родительская таблица

ID EMP_ID EMP_NAME

1 emp01 Сэм

2 emp02 Jam

3 emp03 Мам

Детский стол 1

ID EMP_ID EMP_ADDRESS

1 1 A Street

2 1 B Street

3 2 Z Street

4 3 л Улица

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, мне нужно получить всю информацию из родительских и дочерних таблиц

Идентификатор родительской таблицы и дочерний emp_id образуют отношения внешнего ключа

Как этого достичь?

Ответы [ 4 ]

2 голосов
/ 05 октября 2009
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';

**** EDIT **

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 голос
/ 05 октября 2009

да, но вы получите дублирующую информацию (через декартово значение), основанную на нескольких записях в дочерних таблицах

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

1 голос
/ 05 октября 2009

обычно:

select f1,f2,f3 from t1,t2,t3 where t1.x = t2.y and t1.x = t3.y
0 голосов
/ 05 октября 2009

Есть два способа сделать это:

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);

Они оба оптимизированы одинаково, поэтому на самом деле нет никаких оснований отдавать предпочтение одному над другим, кроме того, что вторая форма также работает для левых объединений и т. П.

Но смотрите предостережение @ Дрэппа о декартовых объединениях. Вся причина размещения адресов и телефонных номеров в отдельных таблицах заключается в том, что вы можете иметь несколько адресов и телефонных номеров для одного сотрудника, и выполнение этого способа даст несколько результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...