Como inserir valores em uma tabela de duas tabelas diferentes?

12

Eu tenho três mesas

students table 
------------------------------------  
id(PK, A_I)  |  student_name | nationality

teachers table
------------------------------------
id(PK, A_I)  |  teacher_name |  email

classroom table
----------------------
id(PK, A_I)   | date   | teacher_id(FK to teachers.id)  |  student_id(FK to students.id)

Se eu foi dado o nome do professor ( davidpor exemplo) e student_id ( 7por exemplo) e pediu para inserir o teacher_idna classroomtabela com base no idna teachersmesa, eu faria:

insert into classroom (date, teacher_id, student_id)
select '2014-07-08', id, 7
from teachers
where teacher_name = 'david';

Agora, e se eu não receber o ID do aluno diretamente e apenas o nome do aluno? Suponha que me deram o nome do professor 'david' e o nome do aluno 'sam'. Como obtenho a tabela teacher_idfrom teacherse também student_idda studentstabela e insiro ambos na classroomtabela com base em seus respectivos nomes?

Baba Kamdev
fonte

Respostas:

15

Você escreveria a consulta assim

insert into classroom (date, teacher_id, student_id)
select '2014-07-08', t.id, s.id
from teachers t,students s
where t.teacher_name = 'david'
and s.student_name = 'sam';

Seja cuidadoso. Este é um produto cartesiano. Outra maneira de abordar isso é

select teacher_id into @tid from teachers where teacher_name = 'david';
select student_id into @sid from students where student_name = 'sam';
insert into classroom (date, teacher_id, student_id) values ('2014-07-08',@tid,@sid);
RolandoMySQLDBA
fonte
Obrigado senhor, posso usar a junção interna aqui?
Baba Kamdev 18/07
Não há necessidade de um INNER JOINdesde então teacherse studentsnão possui relacionamento de chave estrangeira.
RolandoMySQLDBA
6

A maneira mais fácil de fazer isso é usando subconsultas:

 INSERT INTO classroom(teacher_id,student_id)
 VALUES ((SELECT id FROM students WHERE s_name='sam'),
 (SELECT id FROM teacher WHERE t_name='david'));
Eu não sou um robô
fonte
1
INSERT INTO newtable(value1, value2, value3) 
SELECT value1N, value2N, value3N,(SELECT valueN4 FROM secondtable WHERE id='1') 
FROM firsttable WHERE id='1');

Isso colocará o resultado da primeira tabela value1N, value2N, value3Ne o resultado da segunda tabelavalueN4

Resultado:

  • primeira tabela --- |username|password |name|--- (tem 3 valores, mas usamos um)
  • segunda tabela --- |id_number|Adress|tel|--- (tem 3 valores, usamos todos)
  • newtable após a consulta será preenchida --- |id_number|Adress|tel|username|----- (obtemos 4 valores: 3 da segunda tabela e 1 da primeira tabela:
Ile Danilov
fonte