Arbol de categorias en PHP + MySQL

Preguntado hace 1 año

Daniel

Daniel

840Distinciones de plata1Distinciones de bronce8
Votos
PositivosNegativosTotal
4 0 4
93 Visualizaciones
Compártelo: Compártelo en twitterCompártelo en Facebook

Hola,

Estoy armado un sitio de avisos clasificados y necesito leer los nodos de la tabla rubros de una forma transparente

La tabla en la base de datos tiene la sig. estructura:

ID | RUBRO | ID-FATHER

La lectura de los nodos deberia desplegar un array con los rubros:

Ej. Rubros: Motor -> autos, camiones, lanchas, motos... Empleo -> cadetes, vendedores, abogados...

Necesito ejemplos desde ya agradezco sus respuestas

Actualizando datos
Gracias por responder Gabriel, exactamente hay que hacer una función recursiva que recorra todos los nodos y muestre las categorias padre y todos los hijos, no es necesario en este caso leer las subcategorias pero dicha función debería contemplarlo a futuro. Daniel hace 1 año
Hola, Daniel, según entiendo es un select recursivo. Una pregunta, ¿la relación de categorías-subcategorías tiene un límite o puede haber ilimitadas subcategorías? ¿Cuántas relaciones nodo padre-hijo puede haber o en principio no hay límite? Un saludo, Gabriel. Gabriel Molina hace 1 año

2 Respuestas

Hace 1 año

Gabriel Molina
Editada hace 1 año
Votos
PositivosNegativosTotal
202

Como dice Ángel mysql (oracle y sqlserver sí) no soporta recursión en las select.

Sacado de la documentación, podrías hacer

SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4
FROM category AS t1
LEFT JOIN category AS t2 ON t2.parent = t1.category_id
LEFT JOIN category AS t3 ON t3.parent = t2.category_id
LEFT JOIN category AS t4 ON t4.parent = t3.category_id
WHERE t1.name = 'ELECTRONICS';

Pero tendrías que saber cuantos niveles quieres sacar, es decir, en este ejemplo si existiese un nivel 5, lo perderías. Supongo que aunque sean niveles virtualmente ilimitados, en la realidad sí habrá un límite, ¿va a haber más de 10 subcategorías por ejemplo? Si hay límite puedes hacer tantos join como subcategorías y lo tendrías, el select sería largo (déjate algunos niveles de margen) pero funcionaría.

Si piensas que puede haber infinitos, o no quieres tener esta limitación, queda la otra opción un método recursivo que vaya extrayendo todas las subcategorías por cada una, hasta que no haya más. Pero es una aporximación algo ineficiente, hazte la idea de que por cada categoría vas a realizar un select (tenga o no tenga nodos hijos). Seguramente eso sean muchas consultas.

Aunque sea algo cutre, te recomiendo la primera aproximación, a veces pensamos en hacer algo que valga para toda la casuística posible, pero al final la realidad suele ser más limitada.

Cerrar

Gracias, es un ejemplo válido, y te diria que me hace en cierta forma más prolija la programación ya que no tengo que tirar de PHP para leer los nodos, es cuestión de ponerlo en práctica,mientras me da algo de tiempo en encontrar esa recursiva en PHP para futuras ampliaciones. Daniel hace 1 año

Hace 1 año

Ángel Luis Quesada
Votos
PositivosNegativosTotal
202

Ufff con la info que comentas, lo más que te puedo recomendar es que te leas toda esta info al respecto:

http://dev.mysql.com/tech-resources/articles/hierarchical-data.html

http://articles.sitepoint.com/article/hierarchical-data-database/

http://www.artfulsoftware.com/mysqlbook/sampler/mysqled1ch20.html

Como verás después de leerlos, mysql no tiene querys recursivas, así que lo que quieres en una sola query y sin programación por detrás es un poco complicado ;-)

Lo más fácil, según la tabla que tu tienes, dando por sentado que solo hay un subnivel y lo que (creo que) pides es crear un método en PHP que lo saque en dos pasos. El primero que coja todos las categorías, es decir

SELECT FROM table WHERE ID-FATHER null

Y luego un while donde recoger los ids de estas categorías e ir sacando sus "subcategorías". Esto, en caso de tener más de un nivel de profundidad lo deberías hacer de forma recursiva...

Si después de mirar la información tienes alguna duda, aquí estamos para ayudar, pero eso si, especifica un poco más la información al respecto.

Cerrar

Gracias Ángel, precisamente busco una recursiva via Loop, como comentó Gabriel hay un limitante para hacerlo con SQL, por eso busco la solución con una función desde PHP. Daniel hace 1 año

Tu respuesta

Confirmación

Cerrar

Si sales ahora, perderás los cambios. ¿Estás seguro de querer salir?

Para participar en Babelias, debes estar convenientemente validado. Si ya eres usuario inicia sesión, si no lo eres, te puedes registrar.

Dar una respuesta

Trata de ser descriptivo, usa al menos 25 caracteres