Ir para conteúdo
Eduardo Trindade

Select que retorne um atributo entre três tabelas

Recommended Posts

Olá pessoal,

Tenho um pequeno banco de dados para uma Biblioteca Escolar e preciso retornar o nome da pessoa para o qual um livro está emprestado. Seria fácil se os leitores estivessem cadastrados em uma tabela Pessoa, por exemplo, mas há uma tabela para alunos, outra funcionários e outra professores (sim, um equívoco...). A tabela empréstimo possui a seguinte estrutura:

 

tabelaEmprestimo.jpg.f77095043df2116e26f5607b5e0ebae6.jpg

 

Já as tabelas alunos, professores e funcionarios possuem estrutura bastante semelhante, ambas contendo uma chave primária  (id_alunos, id_professores, id_funcionarios) respectivamente e um campo nome (que é o que preciso retornar quando a pessoa em questão estiver com a situação "E" na tabela emprestimo, ou seja, vinculada a duas id, a de sua tabela e a do livro.

Atualmente utilizo o seguinte sql para retornar os livros emprestados apenas para alunos, mas preciso de um que me mostre mesclado, todos os livros emprestados.

Select e.num_emprestimo, l.id_livros, titulo, autor, genero, data_emprestimo, data_devolucao, a.nome as leitor from livros l
inner join emprestimo e on l.id_livros = e.id_alunos
inner join alunos a on e.id_alunos = a.id_alunos
where e.situacao = 'E' order by data_devolucao

consultaEmprestimo.jpg.890bce174f2ef62782189807d50cc2bd.jpg

 

Então é isso. Preciso que na última coluna (Emprestado para) apareça tanto os alunos, quanto professores quanto funcionários.

Alguém pode me ajudar? Pensei em uma procedure, mas não consegui fazer. Se houver uma forma somente com um SQL agradeço muito.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Verdade @Motta. Ainda não tentei, mas tudo que preciso fazer é replicar este select para as outras duas tabelas, de modo que sejam exatamente iguais em número e ordem de colunas, interligando-os com o Union certo? Funciona pra três select? Chegando em casa vou tentar.

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

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

  • Conteúdo Similar

    • Por RENAN KAWAMOTO FAGUNDES
      !

      Olá, boa tarde!
      Estou precisando de uma ajuda em um SCRIPT (SQL).
      Preciso agrupar o resultado por tipo de convênio (CONVENIO).

      Exemplo Acima:
       

       
      Total por tipo de convênio.
      SET DATEFORMAT DMY -- RTM declare @DTINI datetime, @DTFIM datetime set @DTINI = '01/01/2019' set @DTFIM = '01/04/2019' SELECT CASE WHEN CONV_SUS = 'T' THEN 'SUS' WHEN CONV_PARTICULAR = 'T' THEN 'PARTICULAR' WHEN CONV_DS IS NOT NULL THEN 'CONVENIO' END CONVENIO, CONSUMO2.INSU_DS INSUMO, replace(CONSUMO2.EMI_QTDE_COMERCIAL,'.',',') QTDE_COMERCIAL, replace(CONSUMO2.VAL_TOTAL,'.',',') VALOR_TOTAL FROM ( SELECT CONSUMO.* FROM ( SELECT CONV_DS, CONV_SUS, CONV_PARTICULAR, INSU_DS, SUM(ISNULL(EMI_QTDE_COMERCIAL,0)) EMI_QTDE_COMERCIAL, ISNULL(SUM(ISNULL(EMI_QTDE_COMERCIAL,0) * ISNULL(PM,0)),0) VAL_TOTAL FROM ( SELECT CUREMI.*, (SELECT PCONV_DS FROM PLANO_CONVENIO PCONV WHERE PCONV.PCONV_ID = CUREMI.PCONV_ID) PCONV_DS, (SELECT CONV_DS FROM CONVENIO CONV WHERE CONV.CONV_ID = (SELECT CONV_ID FROM PLANO_CONVENIO PCONV WHERE PCONV.PCONV_ID = CUREMI.PCONV_ID) ) CONV_DS, (SELECT CONV_SUS FROM CONVENIO CONV WHERE CONV.CONV_ID = (SELECT CONV_ID FROM PLANO_CONVENIO PCONV WHERE PCONV.PCONV_ID = CUREMI.PCONV_ID) ) CONV_SUS, (SELECT CONV_PARTICULAR FROM CONVENIO CONV WHERE CONV.CONV_ID = (SELECT CONV_ID FROM PLANO_CONVENIO PCONV WHERE PCONV.PCONV_ID = CUREMI.PCONV_ID) ) CONV_PARTICULAR FROM( SELECT INSU_DS, EMI.PCONV_ID, EMI_QTDE_COMERCIAL, EMI.INSU_PRECO_MEDIO_FISCAL PM FROM EMISSAO EMI JOIN SERVICO SERV ON SERV.SERV_ID = EMI.SERV_ID JOIN INSUMO INSU ON INSU.SERV_ID = EMI.SERV_ID LEFT JOIN TIPO_EMISSAO TEMI ON EMI.TEMI_ID = TEMI.TEMI_ID LEFT JOIN ESTOQUE_LOTE ELOTE ON EMI.ELOTE_ID = ELOTE.ELOTE_ID WHERE EMI.ENTI_ID = 1 AND EMI_DT_DISPENSA >= @DTINI AND EMI_DT_DISPENSA < @DTFIM AND INSU.INSU_ID IN (255651, 243116, 243116, 246708, 562, 250466, 413, 808) UNION ALL SELECT INSU_DS, EMI.PCONV_ID, EMI_QTDE_COMERCIAL, EMI.INSU_PRECO_MEDIO_FISCAL PM FROM ITENS_EMISSAO IEMI JOIN EMISSAO EMI ON EMI.EMI_ID = IEMI.EMI_ID JOIN SERVICO SERV ON SERV.SERV_ID = IEMI.SERV_ID JOIN INSUMO INSU ON INSU.SERV_ID = IEMI.SERV_ID LEFT JOIN TIPO_EMISSAO TEMI ON EMI.TEMI_ID = TEMI.TEMI_ID LEFT JOIN ESTOQUE_LOTE ELOTE ON IEMI.ELOTE_ID = ELOTE.ELOTE_ID WHERE EMI.ENTI_ID = 1 AND EMI_DT_DISPENSA >= @DTINI AND EMI_DT_DISPENSA < @DTFIM AND INSU.INSU_ID IN (255651, 243116, 243116, 246708, 562, 250466, 413, 808) UNION ALL SELECT INSU_DS, EMI.PCONV_ID, EMI_QTDE_COMERCIAL, EMI.INSU_PRECO_MEDIO_FISCAL PM FROM ESTORNO_EMISSAO EEMI JOIN ESTORNO EST ON EEMI.EST_ID = EST.EST_ID JOIN EMISSAO EMI ON EMI.EMI_ID = EEMI.EMI_ID JOIN SERVICO SERV ON SERV.SERV_ID = EMI.SERV_ID JOIN INSUMO INSU ON INSU.SERV_ID = EMI.SERV_ID LEFT JOIN TIPO_EMISSAO TEMI ON EMI.TEMI_ID = TEMI.TEMI_ID LEFT JOIN ESTOQUE_LOTE ELOTE ON EEMI.ELOTE_ID = ELOTE.ELOTE_ID WHERE EMI.ENTI_ID = 1 AND EMI_DT_DISPENSA >= @DTINI AND EMI_DT_DISPENSA < @DTFIM AND INSU.INSU_ID IN (255651, 243116, 243116, 246708, 562, 250466, 413, 808) UNION ALL SELECT INSU_DS, EMI.PCONV_ID, EMI_QTDE_COMERCIAL, EMI.INSU_PRECO_MEDIO_FISCAL PM FROM ESTORNO_ITENS_EMISSAO ESTI JOIN ESTORNO EST ON ESTI.EST_ID = EST.EST_ID JOIN ITENS_EMISSAO IEMI ON IEMI.IEMI_ID = ESTI.IEMI_ID JOIN EMISSAO EMI ON EMI.EMI_ID = IEMI.EMI_ID JOIN SERVICO SERV ON SERV.SERV_ID = IEMI.SERV_ID JOIN INSUMO INSU ON INSU.SERV_ID = IEMI.SERV_ID LEFT JOIN TIPO_EMISSAO TEMI ON EMI.TEMI_ID = TEMI.TEMI_ID LEFT JOIN ESTOQUE_LOTE ELOTE ON ESTI.ELOTE_ID = ELOTE.ELOTE_ID WHERE EMI.ENTI_ID = 1 AND EMI_DT_DISPENSA >= @DTINI AND EMI_DT_DISPENSA < @DTFIM AND INSU.INSU_ID IN (255651, 243116, 243116, 246708, 562, 250466, 413, 808)) CUREMI ) CURCC GROUP BY INSU_DS, CONV_DS, CONV_SUS, CONV_PARTICULAR ) CONSUMO ) CONSUMO2 ORDER BY 2, 1  
    • Por snkGOD
      Boas galera, há algum tempo eu tenho vontade de botar em prática um projeto aqui pro meu bairro. Aqui tem uma galera de umas 60 pessoas que sempre organizam pequenos campeonatos e torneios entre eles, eu queria saber o que preciso estudar pra conseguir fazer algo parecido com o CartolaFC, algo pra incluir apenas essa quantidade de pessoas, com sistema de pontuação seguindo o modelo do CartolaFC. É algo pequeno, apenas para nós. Se houver algum script que faça isso e alguém puder me passar o nome, também serve. Grato a todos que se dispuserem a ajudar.
    • Por stewartcintra@
      Tenho um sistema de contas em php mysql, preciso exibir todas as contas do mes agrupadas por categoria e o campo valorR$ para saber o total em reais de cada categoria.
      Não estou conseguindo, como posso fazer isso?
    • Por MateusDuarte
      Podem me ajudar? Sou novato em PHP e estou precisando de uma ajudinha.
      Tenho 2 tabelas no banco: filmes e generos.
      Faço o cadastro individual de todos os generos na tabela generos, e no cadastro de filmes eu puxo todos os generos por um multiple select. Até ai tudo certo, ele salva no banco de dados assim:
      genero1, genero2, genero3.
       
      Porém na hora de mostrar eu não sei separar eles das virgulas.
      Segue meu SELECT simples:
      <main class="content"> <?php $sql = "SELECT * FROM genero ORDER BY RAND()"; $result = $connect->query($sql); if($result->num_rows > 0) { while($row = $result->fetch_assoc()) { $teste = $row["id_genero"]; ?> <section class="panel"> <h2><a id="links-generos" href="generos-filmes.php?id=<?php echo $row['id_genero'];?>"><?php echo $row["descricao"];?></a></h2> <div class="recentslider"> <div class="swiper-container"> <div class="swiper-wrapper"> <?php $sql_t = "SELECT * FROM filmes WHERE id_genero = ".$teste." ORDER BY RAND()"; $result_t = $connect->query($sql_t); if($result_t->num_rows > 0) { while($row_t = $result_t->fetch_assoc()) { ?> <div class="swiper-slide"><?php echo "<a href='single-filmes.php?id=".$row_t['id_filme']."&genero=".$row_t['id_genero']."';>";?><img src="capa/<?php echo $row_t["capa_filme"];?>"><h3 class="hometitle"><?php echo $row_t["titulo_filme"];?></h3></a></div> <?php }} else { echo "0 results"; } ?> </div> <div class="nextdirection recent-next"><img src="img/right-arrow.svg"> </div> <div class="leftdirection recent-prev"><img src="img/left-arrow.svg"> </div> </div> </div> </section> <?php }} else { echo "0 results"; } ?> </main> (Desculpa se não ficou alinhado, só copiei e colei.)

      Reparem que primeiro dou um select na tabela genero, e salvo o ID dela em uma variavel, e depois vou um select na tabela filmes usando a variavel que salvei antes como uma condição.
      Porem na tabela filmes, os generos estão salvos separados por virgula. Como consigo fazer um select separando ela das virgulas?
       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.