71 - Función de control if con varias tablas.


Problema:

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;



Retornar