Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
MATHEUS_LACOMBE_OLIVEIRA

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

Recommended Posts

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.

Compartilhar este post


Link para o post
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)?

Editado por RafaelCLP
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • É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.

    Editado por MATHEUS_LACOMBE_OLIVEIRA

    Compartilhar este post


    Link para o post
    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 ( ... )

     

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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.

    Editado por MATHEUS_LACOMBE_OLIVEIRA
    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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'))

     

    Editado por MATHEUS_LACOMBE_OLIVEIRA

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×