codice:
create table autori (
id_autore int unsigned not null auto_increment,
nome varchar(100),
cognome varchar(100),
primary key (id_autore)
);
insert into autori (nome,cognome) values ('Mario','Rossi'),('Andrea','Bianchi'),('Giovanni','Verdi'),('Stefano','Gialli');
create table libri (
id_libro int unsigned not null auto_increment,
titolo varchar(100),
primary key (id_libro)
);
insert into libri (titolo) values ('Testo 1'),('Testo 2'),('Testo 3'),('Testo 4'),('Testo 5');
create table libri_autori (
id int unsigned not null auto_increment,
id_libro int,
id_autore int,
primary key (id)
);
insert into libri_autori (id_libro,id_autore) values (1,1),(2,2),(2,3),(3,1),(3,2),(4,2),(5,1),(5,2),(5,3);
create table categorie (
id_categoria int not null auto_increment,
categoria varchar(50),
primary key (id_categoria)
);
insert into categorie (categoria) values ('giallo'),('fantasy'),('storico'),('rosa');
create table libri_categorie (
id int not null auto_increment,
id_libro int,
id_categoria int,
primary key (id)
);
insert into libri_categorie (id_libro,id_categoria) values (1,1),(1,2),(2,1),(2,2),(3,3),(4,3),(4,4),(5,1);
select
la.id_libro,
l.titolo,
group_concat(distinct concat_ws(' ',a.cognome,a.nome) order by a.cognome,a.nome ) as autori,
group_concat(distinct c.categoria) as categorie
from libri_autori as la
inner join autori as a on la.id_autore = a.id_autore
inner join libri as l on la.id_libro = l.id_libro
inner join libri_categorie as lc on lc.id_libro = l.id_libro
inner join categorie as c on lc.id_categoria = c.id_categoria
group by l.id_libro
having find_in_set('giallo',categorie)