71 - Función de control if con varias tablas. |
Trabajamos con las tablas "libros" y "editoriales" de una librería.
Eliminamos las tablas, si existen:
drop table if exists libros, editoriales;
Creamos las tablas:
create table libros( codigo int unsigned auto_increment, titulo varchar(40) not null, autor varchar(30) not null default 1, codigoeditorial tinyint unsigned not null, precio decimal(5,2) unsigned, primary key (codigo) ); create table editoriales ( codigo tinyint unsigned auto_increment, nombre varchar(20), primary key (codigo) );
Ingresamos algunos registros para la tabla "editoriales":
insert into editoriales (nombre) values ('Planeta'); insert into editoriales (nombre) values ('Emece'); insert into editoriales (nombre) values ('Paidos');
Ingresamos algunos registros en la tabla "libros":
insert into libros (titulo, autor,codigoeditorial,precio) values('Alicia en el pais de las maravillas','Lewis Carroll',1,23.5); insert into libros (titulo, autor,codigoeditorial,precio) values('Alicia a traves del espejo','Lewis Carroll',2,25); insert into libros (titulo, autor,codigoeditorial,precio) values('El aleph','Borges',2,15); insert into libros (titulo, autor,codigoeditorial,precio) values('Matemática estas ahi','Paenza',1,10);
Queremos saber si hay libros de cada una de las editoriales, necesitamos consultar ambas tablas:
select e.nombre, if (count(l.codigoeditorial)>0,'Si','No') as hay from editoriales as e left join libros as l on e.codigo=l.codigoeditorial group by e.nombre;
Podemos obtener una salida similar usando "case" en lugar de "if":
select e.nombre, case count(l.codigoeditorial) when 0 then 'No' else 'Si' end as 'Hay' from editoriales as e left join libros as l on e.codigo=l.codigoeditorial group by e.nombre;