Ir para conteúdo
Aureo Almeida

Select de três tabelas com chave estrangeira

Recommended Posts

Estou desenvolvendo uma consulta num BD do MYSQL, em que consegui sem problemas listar as características de produtos armazenadas numa  tabela com chave estrangeira da tabela produtos. Porém, não estou conseguindo incluir neste Select uma terceira tabela. O SQL da consulta entre duas tabelas que  está funcionado é o seguinte:

SELECT
      psd_produtos.prd_id,
   psd_produtos.prd_codigo,
   psd_produtos.ctg_id,
   psd_produtos.sct_id,
   psd_produtos.prd_nome,
   psd_produtos.prd_detalhe,
   psd_produtos.prd_descricao,
   psd_produtos.prd_valor,
   psd_produtos.prd_foto1,
   psd_produtos.prd_foto2,
   psd_produtos.prd_foto3,
   psd_produtos.prd_condicoes,
   psd_produtos.prd_itens,
   psd_produtos.prd_estoque,
   psd_produtos.prd_tmpespera,
   psd_cores.crs_id,
   psd_cores.prd_id,
   psd_cores.crs_cores,
   psd_cores.crs_quantidade
FROM
   psd_produtos RIGHT OUTER JOIN psd_cores ON psd_produtos.prd_id = psd_cores.prd_id

WHERE 
   (psd_produtos.prd_id = '5')

Não estou conseguindo adicionar a terceira tabela, que assim como a segunda, do código acima, tem como chave estrangeira o campo psd_produtos.prd_id. Como adiciono a terceira tabela, que também terá como clausula where o valor que for atribuído ao campo psd_produtos.prd_id através de uma variável do PHP, que no exemplo acima está com um valor de teste?

A tabela e seus campos que desejo inserir são os seguintes:

Tabela: psd_sabores,
Campos   
   psd_sabores.sbr_id,
   psd_sabores.prd_id,
   psd_sabores.sbr_sabor,
   psd_sabores.sbr_quantidade,

Fiz vários testes e em todos eles não consegui meu objetivo, que é fazer uma select em que quando um determinado produto for selecionado (na clausula where), seja feita uma consulta em duas tabelas que guardam características indeterminadas e diferentes dele e traga o resultado para ser usado numa página.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se entendi o problema :

 

para acrescentar mais "jons" faça

FROM
   psd_produtos RIGHT OUTER JOIN psd_cores ON psd_produtos.prd_id = psd_cores.prd_id
   psd_produtos RIGHT OUTER JOIN xoto on ...
   psd_cores RIGHT OUTER JOIN xpto2 on ...
Citar

Não estou conseguindo adicionar a terceira tabela

 qual o erro/problema ?

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

   Ocorre que me retorna a  informação de "Erro na execução do comando SQL" no SQL Builder do Scriptcase, onde faço testes de códigos SQL:

  Seguindo tua sugestão de adicionar outros RIGHT OUTER JOIN, o código ficaria assim, postando somente a ultima parte do SQL com a    adição da tabela :

   psd_cores.crs_id,
   psd_cores.prd_id,
   psd_cores.crs_cores,
   psd_cores.crs_quantidade
   psd_sabores.crs_id,
   psd_sabores.prd_id,
   psd_sabores.crs_cores,
   psd_sabores.crs_quantidade
FROM
   psd_produtos RIGHT OUTER JOIN psd_cores ON psd_produtos.prd_id = psd_cores.prd_id 
   psd_produtos RIGHT OUTER JOIN psd_sabores ON psd_produtos.prd_id = psd_sabores.prd_id

WHERE 
   (psd_produtos.prd_id = '5')

Essa solução eu havia tentando e retornado a referida mensagem de erro. 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aureo Almeida

Eu não sei o seu intuido em usar o comando "RIGHT OUTER JOIN", mas eu acredito que para o que você queira fazer o comando "INNER JOIN" deva funcionar muito mais fácil.

 

Então o seu comando SQL deve ficar como abaixo:

 

SELECT
     A.prd_id
    ,A.prd_codigo
    ,A.ctg_id
    ,A.sct_id
    ,A.prd_nome
    ,A.prd_detalhe
    ,A.prd_descricao
    ,A.prd_valor
    ,A.prd_foto1
    ,A.prd_foto2
    ,A.prd_foto3
    ,A.prd_condicoes
    ,A.prd_itens
    ,A.prd_estoque
    ,A.prd_tmpespera
    ,B.crs_id
    ,B.prd_id
    ,B.crs_cores
    ,B.crs_quantidade
    ,C.sbr_id
    ,C.prd_id
    ,C.sbr_sabor
    ,C.sbr_quantidade
FROM psd_produtos A INNER JOIN
     psd_cores    B INNER JOIN
     psd_sabores  C
WHERE A.PRD_ID = B.PRD_ID
  AND B.PRD_ID = C.PRD_ID
  AND A.PRD_ID = ".$_POST['codigo'] -- se for via POST

--ou
--AND A.PRD_ID = ".$_GET['codigo']  -- se for via GET

--ou para o seu teste coloque o valor desejado

--AND A.PRD_ID = '5'

 

! LEMBRANDO QUE, na sua dúvida você colocou no seu WHERE o comando abaixo:

(psd_produtos.prd_id = '5')

Não sei como você especificou no seu BANCO DE DADOS, mas se o seu campo PRD_ID for um númerico você deve colocar apenas 5 sem as aspas simples ( ' ), no código que lhe apresento acima, estou pegando o valor digitado no campo INPUT TYPE="TEXT" que tem o name CODIGO  e já colocando dentro da claúsula WHERE, se o seu campo for do tipo (VARCHAR; CHAR, etc...) então você precisa colocar aspas simples, depois aspas dupla e um ponto no começo e depois inverter no final colocando um ponto, depois aspas dupla e por ultimo aspas simples ficando deste jeito --> caso POST '".$_POST['NomeDoSeuTextBox']."'; caso GET '".$_GET['NomeDoSeuTextBox']."'; caso contrário você pode usar o comando que mandei mesmo.

 

Eu declarei para os nomes das tabelas com os valores "A", "B" e "C", mas você pode usar qualquer outro nome, PRODUTO no lugar do A, CORES no lugar do B e SABORES no lugar do C, não esquecendo de trocar todos para o mesmo nome, vou deixar marcado com cores diferentes caso você queira renomear.

 

Espero ter ajudado.

 

Att.

Felipe Coutinho

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

×

Informação importante

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