Ir ao conteúdo
  • Cadastre-se

Outro Select de todos os autores de um livro quando um autor X está entre eles


Posts recomendados

Olá, tudo bem? Estou com a seguinte dúvida: partindo da ideia de que um livro pode ter mais de um autor criei uma relação muitos-para-muitos entre "Livros" e "Autores". Gostaria então de fazer o seguinte select:

 

Selecionar todos os autores de um determinado livro quando um autor específico está entre eles.

 

Ex: Busco por "João da Silva Pereira"; E o banco me retorna:

 

TÍTULO   |   AUTOR
Livro "A" | João da Silva Pereira
Livro "A" | Mariazinha dos Santos
Livro "A" | Elivaldo de Andrade

 

DUVIDA.png?1505869274

 

Obrigado pela atenção.

Abraços, povo.

Link para o comentário
Compartilhar em outros sites

Teria como ser mais específico?

 

Quais são os campos dessas tabelas? Livro (id_livro, titulo), Autor(id_autor, nome), Intermediaria (id_autorid_livro)?

 

A busca é por um livro específico e um autor, OU é apenas por autor (devendo retornar todos os livros dele com todos os autores desses livros)?

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Ér.. na verdade os campos ali não importam muito. Daria pra considerar apenas TÍTULO e ID nas tabelas principais e só as duas chaves estrangeiras na tabela intermediária. O que acontece é que é só uma situação complicada em que eu precisaria saber todos os integrantes de um determinado grupo de registros pelo nome de um deles. Seria mais ou menos isso. 

 

Ou em outras palavras, como eu falei, selecionar o nome de todos os autores relacionados a um livro pelo nome de um dos autores deste livro.

Link para o comentário
Compartilhar em outros sites

O resto dos campos não importa muito mesmo, eu queria só confirmar. Acho que entendi o que você quer. Dado o nome de um autor, encontrar todos os pares (titulo, autor) para todos os livros que têm o nome dado como um dos autores.

 

Nunca mexi com Firebird e não estou a fim de baixar o software pra poder testar a query, então posso ter errado na sintaxe ou ter feito algo não permitido na linguagem.

SELECT li.titulo, au.nome
FROM Intermediaria AS auli
JOIN Autor AS au ON (au.id_autor = auli.id_autor)
JOIN Livro AS li ON (li.id_livro = auli.id_livro)
WHERE auli.id_livro IN (
	SELECT DISTINCT id_livro FROM Intermediaria WHERE id_autor IN (
		SELECT id_autor FROM Autor WHERE nome='João da Silva Pereira'
	)
)

 

Explicando a solução (assumindo que funciona)

  • Primeiro, seleciono os ids dos autores que têm o nome recebido (assumindo que pode ter vários autores com mesmo nome, se não puder funciona também obviamente)...
SELECT id_autor FROM Autor WHERE nome='João da Silva Pereira'
  • Depois, seleciono os ids dos livros que têm como autor algum dos ids retornados pela query acima:
SELECT DISTINCT id_livro FROM Intermediaria WHERE id_autor IN ( ... )
  • Com os ids dos livros em mãos, posso pegar todos os pares (id_autor, id_livro) da tabela Intermediaria:
SELECT auli.id_livro, auli.id_autor
FROM Intermediaria AS auli
WHERE auli.id_livro IN ( ... )
  • Porém, como nós queremos na verdade os pares (título do livro, nome do autor), fazemos um JOIN com as tabelas de autor e livro, que contém essa informação:
SELECT li.titulo, au.nome
FROM Intermediaria AS auli
JOIN Autor AS au ON (au.id_autor = auli.id_autor)
JOIN Livro AS li ON (li.id_livro = auli.id_livro)
WHERE auli.id_livro IN ( ... )

 

Link para o comentário
Compartilhar em outros sites

Obrigado Rafael pela excelente resposta! Parece bem detalhado, mesmo. Olhando por cima, pelo que eu entendi você fez um SELECT dentro de outro SELECT, certo? Eu realmente não sabia que isso era possível e estava quase me convencendo de que esse caso não tinha solução. Vou testar o método e até amanhã, no máximo, te passo o feedback.

 

Abraços, fera.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

poxa, rafael, desculpa o atraso.. mas como prometido aqui está o feedback: funcionou perfeitamente!!!!

 

não modifiquei quase nada no código, apenas por uma questão hábito deixei sem as abreviações.. e, claro, ajustei o nome das tabelas. De resto ficou igual e funcionou perfeitamente aqui no ems interbase & firibird manager 3.

 

FORUM.png?1506871770

 

select

livros.titulo_livro,
autores.nome_autor

from intermediaria

join autores on (autores.id_autor = intermediaria.id_autor)
join livros on (livros.id_livro = intermediaria.id_livro)

where intermediaria.id_livro in (select distinct id_livro from intermediaria where id_autor in (select id_autor from autores where nome_autor like 'marcos antunes'))

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...