Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

rochajl

Select com tabelas n para n

Recommended Posts

Tenho um banco com alguns relacionamentos n para n. No select que criei consigo trazer o resultado, mas ele está repetindo os dados da tabela principal o número de vezes que possuo registros na tabela de relacionamento. Seria assim:

 

TABPRODUTO

IDPRODUTO

DESCRICAO

 

 

CATEGORIA_HAS_PRODUTO

PRODUTO_IDPRODUTO

CATEGORIA_IDCATEGORIA

 

 

CLASSIFICACAO_HAS_PRODUTO

PRODUTO_IDPRODUTO

CLASSIFICACAO_IDCLASSIFICACAO

 

 

TABCATEGORIA

IDCATEGORIA

CATEGORIA

 

 

TABCLASSIFICACAO

IDCLASSIFICACAO

CLASSIFICACAO

 

 

Com o select que fiz, se um produto tiver duas categorias e uma classificação ele traz isso: IDPRODUTO, DESCRICAO, CATEGORIA1, CLASSIFICACAO, IDPRODUTO, DESCRICAO, CATEGORIA2, CLASSIFICACAO. Se eu tenho duas classificações ele vai mostrar 04 vezes. Estou utilizando PHP e colocando o resultado em um array.

Gostaria de saber se isto é o normal ou se há um select onde eu consiga trazer: IDPRODUTO, DESCRICAO, CATEGORIA1, CATEGORIA2, CLASSIFICAO ou IDPRODUTO, DESCRICAO, CATEGORIA1, CATEGORIA2, CLASSIFICAO1, CLASSIFICACAO2.

 

O select é assim:

 

"Select * from tabproduto as p

inner join categoria_has_produto as chp on (p.idproduto=chp.produto_idproduto)

inner join categoria as c on (chp.categoria_idcategoria = c.idcategoria)

 

inner join classificacao_has_produto as clhp on (p.idproduto=clhp.produto_idproduto)

inner join classificacao as cl on (clhp.classificacao_idclassificacao = cl.idclassificacao)

 

where p.idproduto = 1"

 

Trazendo o resultado o select está, só gostaria de saber se é normal esta duplicação ou se tem como fazer algo mais limpo.

Grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Kara, não sei se lhe entendi corretamente, mas poderia fazer assim:

 

retire os dados que estão repetidos (IDPRODUTO, DESCRICAO) do seu laço, imprimindo-os apenas uma vez no cabeçalho da tabela, por exemplo. O restante dos dados, você imprime dentro do laço (CATEGORIA1, CATEGORIA2, CLASSIFICAO1, CLASSIFICACAO2).

 

Ficaria mais ou menos assim:

IDPRODUTO | DESCRICAO

 

while () ...

CATEGORIA1, CLASSIFICAO1

CATEGORIA2, CLASSIFICACAO2

} // fecha while

 

Espero ter ajudado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seria isso:

 

TABPRODUTO

IDPRODUTO DESCRICAO

01 TESTE01

02 TESTE02

 

 

TABCLASSIFICACAO

IDCLASSIFICACAO CLASSIFICACAO

01 GERAL

02 NORMAL

 

 

TABCATEGORIA

IDCATEGORIA CATEGORIA

01 SECO

02 MOLHADO

 

 

CATEGORIA_HAS_PRODUTO

PRODUTO_IDPRODUTO CATEGORIA_IDCATEGORIA

01 01

01 02

02 01

 

 

CLASSIFICACAO_HAS_PRODUTO

PRODUTO_IDPRODUTO CLASSIFICACAO_IDCLASSIFICACAO

01 01

01 02

02 01

 

Então, o produto com IDPRODUTO 01 possui duas categorias e duas classificações. Como faço um select onde o resultado seja somente:

IDPRODUTO DESCRICAO CATEGORIA CLASSIFICACAO

01 TESTE01 SECO, MOLHADO GERAL, NORMAL

 

O select que estou fazendo está trazendo:

01, TESTE01, SECO, GERAL,

01, TESTE01, MOLHADO, GERAL,

01, TESTE01, SECO, NORMAL,

01, TESTE01, MOLHADO, NORMAL

 

Este resultado está em um array no PHP.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, eu estou com o mesmo problema que você. Eu adoraria se alguém podesse nos ajudar!

 

Isto ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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