Come inserire valori in una tabella da due diverse tabelle?


12

Ho tre tavoli

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 mi davidvenissero dati il ​​nome dell'insegnante ( per esempio) e student_id ( 7per esempio) e mi fosse chiesto di inserire teacher_idla classroomtabella in base idalla teacherstabella, farei:

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

Ora, cosa succede se non mi viene fornito l'ID dello studente direttamente e mi viene dato solo il nome dello studente? Supponiamo che mi sia stato dato il nome dell'insegnante "David" e il nome dello studente "Sam". Come ottengo il teacher_idda teacherstabella e anche student_iddalla studentstabella e inserirli entrambi nella classroomtabella in base ai rispettivi nomi?

Risposte:


15

Scriveresti la query in questo modo

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

Stai attento. Questo è un prodotto cartesiano. Un altro modo di affrontare questo è

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

Grazie signore, posso usare il join interno qui?
Baba Kamdev,

Non c'è bisogno di un da INNER JOINallora teacherse studentsnon hanno una relazione chiave esterna.
RolandoMySQLDBA,

6

Il modo più semplice per farlo è utilizzare le query secondarie:

 INSERT INTO classroom(teacher_id,student_id)
 VALUES ((SELECT id FROM students WHERE s_name='sam'),
 (SELECT id FROM teacher WHERE t_name='david'));

1
INSERT INTO newtable(value1, value2, value3) 
SELECT value1N, value2N, value3N,(SELECT valueN4 FROM secondtable WHERE id='1') 
FROM firsttable WHERE id='1');

Ciò metterà il modulo dei risultati in primo luogo value1N, value2N, value3Ne il risultato in seconda tabellavalueN4

Risultato:

  • prima tabella --- |username|password |name|--- (ha 3 valori, ma ne usiamo uno)
  • seconda tabella --- |id_number|Adress|tel|--- (ha 3 valori, usiamo tutti)
  • newtable dopo la query verrà riempito --- |id_number|Adress|tel|username|----- (otteniamo 4 valori: 3 dalla seconda tabella e 1 dalla prima tabella:
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.