elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  Arbol multinivel con una sola consulta
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Arbol multinivel con una sola consulta  (Leído 10,281 veces)
Alex_bro


Desconectado Desconectado

Mensajes: 1.246



Ver Perfil
Arbol multinivel con una sola consulta
« en: 20 Julio 2011, 15:01 pm »

Buenas,
gracias a todos por la ayuda, y un especial saludo a madpitbull_99 y a дٳŦ* (Para mi ING xD) por su ayuda en mi anterior tema.

Tengo un problemilla que seguramente es una tonteria, pero bueno desde ayer estoy googleando y no le encuentro solucion clara.
Quiero crear un menu, con categorias y dentro de estas, sus subcategorias, pero que se pueda generar con una sola consulta a MySQL. Yo tengo una tabla con las columnas cat_id, catpadre_id, cat_nombre ... y en todos sitios recomiendan hacer una consulta inicial con catpadre_id = 0 y luego con un bucle ir haciendo consultas de cada categoria para sacar las subcategorias.... pero eso me parece un devorador de recursos cuando el arbol sea medianamente grande...

Como se les ocurre que puedo hacerlo sin tener que recurrir a esos cientos de consultas sql?

Gracias :)


En línea

Beakman

Desconectado Desconectado

Mensajes: 190



Ver Perfil WWW
Re: Arbol multinivel con una sola consulta
« Respuesta #1 en: 28 Julio 2011, 08:24 am »

Se puede hacer de muchas formas.
Para mi es una bestialidad ( sin ofender a nadie ) hacer tantas consultas para algo tan simple.
Es más óptimo no molestar tanto a la base de datos, traer todo lo que necesites en una sola consulta y luego "desmenuzarlo".

Por ejemplo:

categoría_0   sub-categoría_0
categoría_0   sub-categoría_1
categoría_1   sub-categoría_2
categoría_1   sub-categoría_3
categoría_1   sub-categoría_4
categoría_2   sub-categoría_5
categoría_2   sub-categoría_6
categoría_3   sub-categoría_7

Entonces usas una variable por ejemplo $categoria_actual, donde almacenás el valor de la categoría de la cual buscas sub-categorías, y con un while vas buscando las sub-categorías y las agregas.
Cuando ya no tengas sub-categorías, pasas a la siguiente categoría..
Espero se entienda.


En línea

Alex_bro


Desconectado Desconectado

Mensajes: 1.246



Ver Perfil
Re: Arbol multinivel con una sola consulta
« Respuesta #2 en: 11 Agosto 2011, 20:14 pm »

Muchas gracias por la respuesta :)

La verdad es que tienes razon en que es una bestialidad, y mas cuando en muchos hostings limitan el numero de consultas a la db por hora.

El tema de tratamiento con arrays de esa forma me cuesta bastante... si bien es cierto en estos dias he encontrado sitios que recomiendan hacer lo que dices, yo no consigo hacerme un esquema mental del codigo... pero tengo que superar algun dia eso jaja. Si consigo hacerlo posteo aqui la solucion :)

Gracias de nuevo =D
En línea

~ Yoya ~
Wiki

Desconectado Desconectado

Mensajes: 1.125



Ver Perfil
Re: Arbol multinivel con una sola consulta
« Respuesta #3 en: 11 Agosto 2011, 21:52 pm »

Puedes guardar TODOS los datos serializados en la DB...


Serialization
« Última modificación: 11 Agosto 2011, 21:53 pm por ~ Yoya ~ » En línea

Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.
Alex_bro


Desconectado Desconectado

Mensajes: 1.246



Ver Perfil
Re: Arbol multinivel con una sola consulta
« Respuesta #4 en: 14 Agosto 2011, 16:29 pm »

Buenas,
gracias a los 2 :) ya casi lo tengo, vamos he conseguido ordenar todo con el codigo que pongo ha continuacion, pero necesito una ayudita.

Código
  1. function ordenarCats($tree,$parent=0){
  2. $tree2 = array();
  3. $tree3 = array();
  4.        foreach($tree as $i => $item){
  5.            if($item['padre_id'] == $parent){
  6.                $tree2[$item['cat_id']] = $item;
  7.                $tree2[$item['cat_id']]['subcats'] = ordenarCats($tree, $item['cat_id']);
  8.            }
  9.        }
  10.  
  11.        return array_values($tree2); /** Reindexamos */
  12. }

Esto me genera un arbol donde cada categoria tiene dentro otros arrays con sus subcategorias... haciendo un sistema de profundidad ilimitada, pero para mostrarlo en la plantilla necesito que todo este a un solo nivel, para no tener que mezclar tanto codigo en la plantilla html metiendo una funcion recursiva... creo que es mas limpio un simple for y yasta, no se si me explico.

He intentado eso con el siguiente codigo, pero no funciona:

Código
  1. function convert($tree){
  2. $tree3 = array();
  3. foreach($tree as $i => $item){
  4. $tree3[] = $item;
  5. convert($item['subcats']);
  6. }
  7. return $tree3;
  8. }

Gracias de ante mano por todo :)
En línea

Beakman

Desconectado Desconectado

Mensajes: 190



Ver Perfil WWW
Re: Arbol multinivel con una sola consulta
« Respuesta #5 en: 15 Agosto 2011, 03:00 am »

A ver mira te dejo un código que podrías modificar, para que no te hagas tantos líos con llamadas recursivas y eso. Verificalo:

Código
  1. $categoria_actual;
  2. $primera_vuelta = true;
  3. while( $fila = mysql_fetch_row( $resultado ) )
  4. {
  5. if( $primer_vuelta )
  6. {
  7. $categoria_actual = $fila[ 0 ];
  8. echo "<ul>";
  9. echo "<li>";
  10. echo $categoria_actual;
  11. echo "<ul>";
  12. $primera_vuelta = false;
  13. }
  14. else
  15. {
  16. if( $categoria_actual != $fila[ 0 ] )
  17. {
  18. $categoria_actual = $fila[ 0 ];
  19. echo "</ul>";
  20. echo "</li>";
  21. echo "<li>";
  22. echo $categoria_actual;
  23. echo "<ul>";
  24. }
  25. }
  26. echo "<li>";
  27. echo $fila[ 1 ];
  28. echo "</li>";
  29. }
  30. echo "</ul>";
  31. echo "</li>";
  32. echo "</ul>";
  33.  
« Última modificación: 15 Agosto 2011, 03:02 am por CrisQC » En línea

Alex_bro


Desconectado Desconectado

Mensajes: 1.246



Ver Perfil
Re: Arbol multinivel con una sola consulta
« Respuesta #6 en: 15 Agosto 2011, 22:22 pm »

Muchas gracias, voy a estudiarlo y ver que tal me salen las modificaciones, y luego publico una respuesta :)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines