Ir para conteúdo
Fórum Script Brasil
  • 0

Consulta Com 3 tabelas um para muitos


m3io

Pergunta

Boas Pessoal, estou aqui com um problema que não consigo resolver e precisava da vossa ajuda

é assim

Tenho 1 sistema para requisitar revistas

- so existe uma revista de cada (1exemplar) logo ao ser requisitada não pode mais aparecer na lista ate ser entregue .

-objectivo é ter uma lista em um formulario que mostra todas as revistas disponiveis, mas como tenho o campo entregue (sim/não) na tabela requisicao tenho que verificar se a revista já foi requisitada e se foi se foi entregue

é esta condicao que estou a testar fazer ,

mas de algum jeito não estou entrando bem na onda.

tenho aqui o sql que já fiz, mas acho que estou a pensar na logica errada

SELECT revista.revista, rev_req.rev_id
FROM revista INNER JOIN (requisicao INNER JOIN rev_req ON requisicao.id = rev_req.req_id) ON revista.id_rev = rev_req.rev_id
WHERE (((Exists (SELECT * FROM requisicao WHERE entregue = Yes))=True));

relw.png

Sera que alguém me consigo dizer o que estou fazendo errado.

Obrigado pela vossa ajuda

Cumprimentos

Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0

select distinct r.revista from revista r, rev_req x, requisicao y where r.id_rev=x.rv_id and x.req_id=y.id and y.entregue='sim' order by r.revista

Veja se isso ajuda! Por favor dê um feedback mesmo que não funcione!

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado pela resposta, mas infelizmente não resolveu o meu problema :wacko:

rel2h.png

Eu já consegui listar todas as disponiveis das requisições, o problema é mesmo que não consigo listar tambem as que nunca foram requisitadas

para todas as disponiveis nas requisições usei

SELECT DISTINCT revista.revista, requisicao.entregue
FROM requisicao INNER JOIN (revista INNER JOIN rev_req ON revista.id_rev = rev_req.rev_id) ON requisicao.id = rev_req.req_id
WHERE (((requisicao.entregue)=Yes));

mas sera que existe alguma maneira de juntar elas com aquelas revistas que nunca foram sequer requisitadas?

Obrigado

Link para o comentário
Compartilhar em outros sites

  • 0

Não seria simplesmente colocar um 'id_revista' no tabela de requisicao e relacionar apenas 2 tabelas? Eu entendi que cada revista é individual e cada uma tem um estado diferente, (entregue/não entregue)

No meu select anterior, veja se resolve:

select distinct r.revista from revista r, rev_req x, requisicao y where r.id_rev=x.rv_id and x.req_id=y.id and ( y.entregue='sim' or y.datar="") order by r.revista

Link para o comentário
Compartilhar em outros sites

  • 0

Sandro2011 muito obrigado pelos seus feedbacks.

não , se eu tivesse o d_revista na tabela requisicao so poderia ter uma unica revista por cada requisicao, mas não é o caso.

mas sim eu tenho uma requisicao com varias revistas e cada uma delas é unica.

Essa query como a anterior fazem um pop.up

Valor do parametro
x.rv_id
________________

não entendo é como faz isso de dar outros nomes as tabelas, e não ter inner join :(

estou farto de procurar solucao e ler tutoriais e não consigo resolver :(

Link para o comentário
Compartilhar em outros sites

  • 0

M3io, não sei se você observou, mas naquele select que eu enviei tem um erro: onde está x.rv_id é x.rev_id

M3io, veja se resolve isso:

select distinct r.revista from revista r, rev_req x, requisicao y where r.revista not in (select distinct r.revista from revista r, rev_req x, requisicao y where r.id_rev=x.rev_id and x.req_id=y.id and ( y.entregue='sim' or y.datar="")) order by r.revista

nessa consulta, aqui em casa eu consegui ver as revistas que não estão nas requisições.

Link para o comentário
Compartilhar em outros sites

  • 0

Boas de novo, era exactamente isso que eu tentei fazer logo a primeira vez mas nunca conseguia acertar na logica

mas...

continua com problemas de syntax :wacko:

rel3.png

onde eu errei??? tentei colocar ";" no final, tentei colocar as palavras reservadas em maiusculas

mas dao deu certo de nenhuma maneira, estou a usar o access 2007 sera isso?

Link para o comentário
Compartilhar em outros sites

  • 0

Esse funciona , já encontrei a syntax certa e devolve-me os valores correctos, Mas ao usar isso num sub formulario da requisicao não me deixa escolher os valores porque diz que não tem onde os guardar...

mais tarde liguei eu as tabelas com inner join e voltei á estaca zero , e passou de novo so a devolver quem já foi entregue esquecendo quem nunca foi requisitado

..

Link para o comentário
Compartilhar em outros sites

  • 0
Boas de novo, era exactamente isso que eu tentei fazer logo a primeira vez mas nunca conseguia acertar na logica

mas...

continua com problemas de syntax :wacko:

rel3.png

onde eu errei??? tentei colocar ";" no final, tentei colocar as palavras reservadas em maiusculas

mas dao deu certo de nenhuma maneira, estou a usar o access 2007 sera isso?

M3io, pela imagem não está dando para ver, mas será que o access não aceita 'aspas' na comparação de strings?

troque:

y.entregue='sim' or y.datar="" (2 aspas)

por

y.entregue='sim' or y.datar='' (2 apostrofes)

Esse funciona , já encontrei a syntax certa e devolve-me os valores correctos, Mas ao usar isso num sub formulario da requisicao não me deixa escolher os valores porque diz que não tem onde os guardar...

mais tarde liguei eu as tabelas com inner join e voltei á estaca zero , e passou de novo so a devolver quem já foi entregue esquecendo quem nunca foi requisitado

..

Você está fazendo a aplicação no access? infelizmente um não entendo nada de access, somente alguma coisa de SQL. Uso SQL em aplicações no PHP. Boa Sorte!

Link para o comentário
Compartilhar em outros sites

  • 0

amigo, acredito que sua logica está errada.

ao invés de ter um campo sim/não.. eu faria o seguinte:

use os campos que você já tem de datas: datar e datae

crie uma consulta simples de nome CONS_REV_IND com a tabela REQUISICAO usando criterio nos campos DATAR e DATAE:

DATAR = NOT NULL

DATAE = IS NULL

isso trará as revistas que estão indisponiveis.

então crie uma nova consulta usando a tabela REVISTA e a consulta CONS_REV_IND

faça um relacionamento do tipo LEFT JOIN entre REVISTA e CONS_REV_IND pelo campo ID da revista

adicione na consulta pelo menos os campo revista.id_rev e depois CONS_REV_IND.id usando criterio neste ultimo = IS NULL

assim a consulta te retornara todas as revistas cadastradas menos aquelas que estão requisitadas e não tiveram data de entrega lançada.

abraços

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...