m@dDog 5 Denunciar post Postado Outubro 7, 2008 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
NaPraia 12 Denunciar post Postado Outubro 7, 2008 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
m@dDog 5 Denunciar post Postado Outubro 7, 2008 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
NaPraia 12 Denunciar post Postado Outubro 7, 2008 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
m@dDog 5 Denunciar post Postado Outubro 7, 2008 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
NaPraia 12 Denunciar post Postado Outubro 7, 2008 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
giesta 29 Denunciar post Postado Outubro 7, 2008 Mto legal NaPraia, pena que isso eh pra Oracle... Compartilhar este post Link para o post Compartilhar em outros sites
m@dDog 5 Denunciar post Postado Outubro 7, 2008 É 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
NaPraia 12 Denunciar post Postado Outubro 8, 2008 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