Jump to content
pauloabreu83

Query relação muitos-para-muitos (obter uma linha em vez de tabela)

Recommended Posts

pauloabreu83

Boas,

Tenho uma bd que relaciona compras com empresas.

Alguém me pode ajudar se for possível com esta situação, possuo 3 tabelas conforme descrevo abaixo onde existe uma relação de muitos para muitos entre a tabela compras e empresas:

tabela compras -> codCompra, objectoCompra

tabela empresas -> codEmpresa, nome

tabela tabunicompemp -> codEmpresa, codCompra

Implementei esta query:

SELECT compras.objectoCompra,empresas.nome FROM compras, tabunicompemp, empresas WHERE compras.codCompra=tabunicompemp.codCompra AND tabunicompemp.codEmpresa=empresas.codEmpresa

Mas devolve uma tabela como esta com 3 linhas:

objectoCompra | nome

peras|Continente

peras|Intermarche

peras|Jumbo

Eu queria que o resultado fosse:

objectoCompra | nome1 | nome2 | nome3

peras|Continente|Intermarche|Jumbo

Desde já o meu muito obrigado.

Share this post


Link to post
Share on other sites
softklin

Na tua query estás a pedir o objectoCompra e o nome de uma empresa associada a esse registo. Como encontraste 3 lojas, ele devolve-te os 3 registos.

Não creio que funcione para strings, mas existe o group by, que agrupa dados de um indice semelhante. Neste caso a tua query ficava igual, acrescentando no fim:

GROUP BY objectoCompra

No teu campo nome terias de usar um operador de concatenação. Mas mesmo assim ias ficar com apenas uma coluna.

Não sei se é alguma restrição, mas penso que fique mais fácil obteres os resultados linha a linha na linguagem de programação que estás a usar.


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites
pauloabreu83

Na tua query estás a pedir o objectoCompra e o nome de uma empresa associada a esse registo. Como encontraste 3 lojas, ele devolve-te os 3 registos.

Não creio que funcione para strings, mas existe o group by, que agrupa dados de um indice semelhante. Neste caso a tua query ficava igual, acrescentando no fim:

GROUP BY objectoCompra

No teu campo nome terias de usar um operador de concatenação. Mas mesmo assim ias ficar com apenas uma coluna.

Não sei se é alguma restrição, mas penso que fique mais fácil obteres os resultados linha a linha na linguagem de programação que estás a usar.

Dessa forma só obtenho uma linha, mas só contém uma empresa.

Eu queria usar isto num gridview em asp.net e necessito de mostrar 3 fornecedores para cada produto.

Share this post


Link to post
Share on other sites
KTachyon

O que podes fazer é concatenar as empresas resultantes, obtendo uma única coluna com todas as empresas separadas por vírgula (csv).

Seria qualquer coisa do género:

SELECT compras.objectoCompra, GROUP_CONCAT(empresas.nome)
FROM compras, tabunicompemp, empresas
WHERE compras.codCompra=tabunicompemp.codCompra
AND tabunicompemp.codEmpresa=empresas.codEmpres
GROUP BY compras.objectoCompra


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
pauloabreu83

Muito obrigado...não conhecia este GROUP_CONCAT...

Abraço

O que podes fazer é concatenar as empresas resultantes, obtendo uma única coluna com todas as empresas separadas por vírgula (csv).

Seria qualquer coisa do género:

SELECT compras.objectoCompra, GROUP_CONCAT(empresas.nome)
FROM compras, tabunicompemp, empresas
WHERE compras.codCompra=tabunicompemp.codCompra
AND tabunicompemp.codEmpresa=empresas.codEmpres
GROUP BY compras.objectoCompra

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.