Ir para conteúdo

POWERED BY:

Arquivado

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

m@dDog

Selecionar categorias e subcategorias de um produto

Recommended Posts

Estou fazendo uma busca de produto e tenho que trazer as categorias e subcategorias para um produto

 

Tenho estas tabelas:  - produtos
						 - id
 
					  - categorias
						 - id
						 - categoria_id

E uma tabela categorias_produtos que relaciona as duas tabelas acima

 

uma categoria pode ter varias subcategorias e cada subcategria pode ter varias outras subcategorias

isto acontece pelo categoria_id da tabela categoria

 

 

Qual seria a melhor maneira de eu trazer as subcategorias ate chegar na categoria pai de um determinado produto???

 

Caso eu não tenho me explicado bem ai vai um exemplo:

 

id	 categoria_id 	 descricao

1 		null			 Entreterimento
2		 1				 Eletronicos
3		 2				 Video Game

 

e eu tenho um produto "Play Station" que tem categoria_id = 2

 

Como faço para chegar em resutado que faça aquele esquema tipo:

 

Você esta aqui:

Entreterimento->Eletronicos->Video Game->Atari

 

 

Valeu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

na tabela categoria você diz que tem

id

id_categoria

para que serve cada campo?? qual a diferença?

 

você faria um select assim:

select a.descricao, c.descricao from produto a,
inner join produto_categoria b on (a.id = b.id_produto)
inner join categoria b on (b.id_categoria = c.id)

Compartilhar este post


Link para o post
Compartilhar em outros sites

na tabela categoria você diz que tem

id

id_categoria

para que serve cada campo?? qual a diferença?

 

você faria um select assim:

select a.descricao, c.descricao from produto a,
inner join produto_categoria b on (a.id = b.id_produto)
inner join categoria b on (b.id_categoria = c.id)

 

O campo "id" da tabela categoria é o campo chave da tabela.

já o campo "categoria_id" quando estiver preenchido significa que a categoria pertence a uma outra categoria, ouseja, esta é uma subcategoria.

Compartilhar este post


Link para o post
Compartilhar em outros sites

select a.descricao, c.descricao, d.descricao from produto a,

inner join produto_categoria b on (a.id = b.id_produto)

inner join categoria c on (b.id_categoria = c.id)

inner join categoria d on (c.id = d.categoria_id)

assim aparece o nome do produto, da categoria e da subcategoria

Compartilhar este post


Link para o post
Compartilhar em outros sites

select a.descricao, c.descricao, d.descricao from produto a,
inner join produto_categoria b on (a.id = b.id_produto)
inner join categoria c on (b.id_categoria = c.id)
inner join categoria d on (c.id = d.categoria_id)
assim aparece o nome do produto, da categoria e da subcategoria

 

Mas eu não sei à quantas subcategorias um produto pode estar dentro

Tem que ser algo dinâmico

 

Eu acredito que não dê para fazer só usando SQL

acho que terei que usar programação para percorrer categoria apos categoria até chegar na categoria pai

 

Estou certo????

Compartilhar este post


Link para o post
Compartilhar em outros sites

usa START WITH/CONNECT BY

 

SELECT Hierárquico

Sexta-feira, 30 de Dezembro de 2005

Com a utilização das opções START WITH/CONNECT BY dentro de um SELECT, podemos retornar registros de forma hierárquica.

 

 

O select hierarquico é utilizado para possibilitar uma busca pelos registros mestres e após pelos seus detalhes. Podemos chamar também de busca dos registros Pais e depois pelos seus filhos correspondentes.

Um bom exemplo pode ser obtido usando uma das tabelas padrões do Oracle, a tabela EMP.

 

A tabela EMP tem o código do empregado e o código do seu gerente(superior).

Montando uma query para buscar de forma hierárquica os empregados e mostrando seus correspondentes gerentes(ou superiores), temos o exemplo abaixo:

 

SELECT LPAD(' ' ,2*level) || ename empregados

 

  FROM emp                                

 

 START WITH ename ='KING'                 

 

       CONNECT BY PRIOR empno= mgr;       

Resultado:

EMPREGADOS      

--------------     

    KING            

        JONES         

            SCOTT       

                ADAMS     

            FORD        

                SMITH     

        BLAKE         

            ALLEN       

            WARD        

            MARTIN      

            TURNER      

            JAMES       

        CLARK         

            MILLER      

 

A clausula START WITH determina a chave inicial da busca.

Já a clausula CONNECT BY determina como buscar os filhos de um determinado registro pai, criando uma condição de hierarquia entre os registros.

A variável level guarda o nível de cada registro na tabela hierarquica montada.

Neste exemplo o KING é o level 1, JONES, BLAKE e CLARK são level 2 e assim por diante.

Com isso, foi possível montar os nomes deslocados para a direita, visualizando facilmente a hierarquia existente entre os registros.

-- closure.sql - Exemplo de uso da clausula "connect by prior" do Oracle:

-- mostra o fecho transitivo de uma relacao binaria:

-- a partir do funcionario KING (presidente) mostra recursivamente

-- todos os seus subordinados

-- a variavel prdefinida LEVEL pode ser usada na clausula where

-- para parar no nivel desejado

 

select LPAD(' ', 2*(LEVEL-1)) ||

ename organizacao, empno, mgr, job

from emp

connect by prior empno=mgr

start with ename='KING'

 

Otimizar querys utilizando Explain

Quarta-feira, 09 de Novembro de 2005

 

O Explain mostra o plano de execução que o Oracle monta para cada query a ser executada.

É possível ver se uma query está usando índice ou não e se são os índices corretos.

Além disso, é fornecido o custo que cada join tem para ser executado.

Quanto menor o custo, mais rápido a query deverá ser executada.

É preciso criar uma tabela auxiliar que utilizaremos para guardar as informações sobre o plano de execução.

Existe um script que cria a tabela PLAN_TABLE, em geral ele está no diretório /rdbms/admin/ e seu nome é utlxplan.sql.

É necessário que o banco de dados esteja setado para utilizar o otimizador para custo para que se tenha o valor do custo definido no plano de execução.

O script abaixo é um exemplo de uma query que acessa as tabelas EMP e DEPT do usuário SCOTT. O resultado irá mostrar os índices utilizados para acessar estas duas tabelas e o custo de cada acesso. No item OPTIONS é mostrado o tipo de acesso utilizado, quando esta opção mostra a palavra FULL é porque nenhum índice foi utilizado pelo otimizador da Oracle. No item OBJECT_NAME é mostrado os nomes das tabelas acessadas e o nome dos índices utilizados.

 

Para executar este script para outras querys, basta substituir o SELECT utilizado abaixo por qualquer outro que faça acesso ao seu banco de dados.

 

set linesize 110;

set pagesize 100;

delete from plan_table;

commit;

explain plan for

SELECT e.empno, e.ename

FROM dept d

,emp e

WHERE d.deptno = 10

and e.deptno = d.deptno

/

 

col operacao format a30

col options format a30

col object_name format a30

col custo format a10

select lpad(' ',2*(level-1))||operation operacao,options,object_name , to_char(cost) custo

from plan_table

start with id = 0

connect by prior id = parent_id;

 

Resultado da execução do script

 

OPERACAO           OPTIONS        OBJECT_NAME    CUSTO

------------------ -------------- -------------- -----

SELECT STATEMENT                                 2

  NESTED LOOPS                                   2

    INDEX          UNIQUE SCAN    PK_DEPT        1

    TABLE ACCESS   FULL           EMP            1

Compartilhar este post


Link para o post
Compartilhar em outros sites

É isto mesmo NaPraia, "SELECT HIERÁRQUICO", mas como fazer no MySQL????

 

E tambem no meu caso eu só tenho o nível mais baixo.

assim, no teu exmplo eu teria somente o ADAMS e precisaria chegar ao KING

 

KING			
		JONES		 
			SCOTT	   
				ADAMS

 

 

Postem ai.

Compartilhar este post


Link para o post
Compartilhar em outros sites

mas como fazer no MySQL????

foi mal, eu achei que o teu tópico estava no oracle, não me toquei que fosse mysql, infelizmente nessa linguagem não tenho a menor idéia de como fazer isso.

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.