77 - Insertar registros con valores de otra tabla (insert - select - join) |
Tenemos las tabla "libros", "editoriales" y "cantidadporeditorial".
Eliminamos las 3 tablas si existen:
drop table libros, editoriales, cantidadporeditorial;
Creamos las tablas:
create table libros( codigo int unsigned auto_increment, titulo varchar(40), autor varchar(30), codigoeditorial tinyint unsigned, precio decimal(5,2) unsigned, primary key(codigo) ); create table editoriales( codigo tinyint unsigned auto_increment, nombre varchar(20), primary key(codigo) ); create table cantidadporeditorial( nombre varchar(20), cantidad smallint unsigned );
Ingresamos algunos registros para las 2 primeras tablas:
insert into libros values (1,'El aleph','Borges',2,23.5); insert into libros values (2,'Alicia en el pais de las maravillas', 'Lewis Carroll',1,15); insert into libros values (3,'Matematica estas ahi','Paenza',2,34.6); insert into libros values (4,'Martin Fierro','Jose Hernandez',3,43.5); insert into libros values (5,'Martin Fierro','Jose Hernandez',2,12); insert into editoriales values(1,'Planeta'); insert into editoriales values(2,'Emece'); insert into editoriales values(3,'Paidos'); insert into editoriales values(4,'Plaza & Janes');
Queremos insertar registros en la tabla "cantidadporeditorial", los nombres de las distintas editoriales de las cuales tenemos libros y la cantidad de libros de cada una de ellas.
Podemos lograrlo en 2 pasos: 1º) realizar la consulta a las tablas "libros" y "editoriales" para obtener el nombre y la cantidad de cada editorial y 2º) insertar los registros uno a uno en la tabla "cantidadporeditorial".
O podemos lograrlo en un solo paso, realizando el "insert" y el "select" en una misma sentencia:
insert into cantidadporeditorial select e.nombre,count(l.codigoeditorial) from editoriales as e left join libros as l on e.codigo=l.codigoeditorial group by e.nombre;
Note que usamos "left join" porque hay una editorial de la cual no tenemos libros; si usáramos "join", esa editorial no aparecería en la lista porque no encontraría coincidencia de códigos.