Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Problema ordenando datos en query

Estas en el tema de Problema ordenando datos en query en el foro de Mysql en Foros del Web. Saludos amigos, posiblemente sea algo sencillo, pero nose si sera que mi cabeza no computa pero no le he podido encontrar solucion, talvez me ayuden ...
  #1 (permalink)  
Antiguo 21/01/2014, 17:46
Avatar de xcars  
Fecha de Ingreso: mayo-2005
Ubicación: El Salvador
Mensajes: 753
Antigüedad: 18 años, 11 meses
Puntos: 4
Problema ordenando datos en query

Saludos amigos, posiblemente sea algo sencillo, pero nose si sera que mi cabeza no computa pero no le he podido encontrar solucion, talvez me ayuden a encontrar una luz o una solucion.

Tengo una tabla de categorias que será recursiva para tener categorias padres e hijos, es decir, CATEGORIA_PADRE1 puede tener hijos y nietos. Por el momento, solo seran tres niveles, es decir padre,hijo,nieto pero queda la posibilidad de que sean mas niveles, aunque de eso me preocupo despues.
La tabla ademas tiene un campo de ordenacion interno, es decir, del padre1 como quiero que queden ordenados los hijos y de los hijos tambien puedo definir como quiero que queden ordenados los nietos.

El punto es que necesito hacer un query que obtenga el listado de categoria_id y categoria _nombre ordenado por padre, hijos, nietos en el orden del campo de ordenacion, ej:
Categoria Padre: Bienes y raices
hijo1: Compra y Venta (campo orden=1)
hijo2: Alquileres (campo orden=2)
hijo3: Otros (campo orden=3)

el hijo1 del hijo1: Casas (campo orden=1)
el hijo 2 del hijo1: Apartamentos (campo orden=2)
el hijo 3 del hijo1: otros en compra y venta(campo orden=3)

el hijo1 del hijo2: Casas (campo orden=1)
el hijo2 del hijo2: Apartamentos (campo orden=2)
el hijo3 del hijo2: Otros Alquileres(campo orden=3)

Y el resultado que busco del query ordenado seria:

Bienes y Raices
Compra y Venta
Casas
Apartamentos
Otros en compra y venta
Alquileres
Casas
Apartamentos
Otros Otros Alquileres
Otros (ojo este es el hijo3 del padre)

La estructura de la tabla es la siguiente:
Código MySQL:
Ver original
  1. CREATE TABLE `categorias` (
  2.     `categoria_id` INT(11) NOT NULL AUTO_INCREMENT,
  3.     `categoria_nombre` VARCHAR(75) NULL DEFAULT NULL,
  4.     `parent_id` INT(11) NULL DEFAULT NULL,
  5.     `categoria_descripcion` TEXT NULL,
  6.     `categoria_estado_id` ENUM('Activo','Inactivo') NULL DEFAULT NULL,
  7.     `categoria_precio` ENUM('Si','No') NULL DEFAULT 'Si',
  8.     `categoria_articulo` ENUM('Si','No') NULL DEFAULT 'Si',
  9.     `posicion_orden` TINYINT(4) NULL DEFAULT '1',
  10.     PRIMARY KEY (`categoria_id`),
  11.     INDEX `codigo_cat` (`categoria_id`)
  12. )

Y el query que tengo y que no funciona es
Código MySQL:
Ver original
  1. SELECT parent_id,categoria_id,categoria_nombre,posicion_orden FROM categorias ORDER BY parent_id ASC,posicion_orden

Alguien me podria dar una luz de como ordenar de esa manera o que podria hacer para lograr dicho resultado.

De antemano gracias por sus ayudas y aportes.
__________________
Con Microaplicaciones puedes hacer tu tienda en línea de forma sencilla y rápida, sin costos ocultos y con mucha responsabilidad.
  #2 (permalink)  
Antiguo 22/01/2014, 03:44
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Problema ordenando datos en query

Agrega un campo más "nivel" donde los padres tengan nivel=0, hijos nivel=1, nietos nivel=2, .... y así sucesivamente.... y luego dale dos vueltas más....

Si los niveles no van a tener limite en el futuro debes buscar ahora una solución que lo tenga en cuenta no lo soluciones para 3 niveles....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 22/01/2014, 09:17
Avatar de xcars  
Fecha de Ingreso: mayo-2005
Ubicación: El Salvador
Mensajes: 753
Antigüedad: 18 años, 11 meses
Puntos: 4
Respuesta: Problema ordenando datos en query

Excelente, no se me habia ocurrido, voy a probarlo pero estoy casi seguro que va a funcionar, te lo agradezco muchisimo.....

Cita:
Iniciado por quimfv Ver Mensaje
Agrega un campo más "nivel" donde los padres tengan nivel=0, hijos nivel=1, nietos nivel=2, .... y así sucesivamente.... y luego dale dos vueltas más....

Si los niveles no van a tener limite en el futuro debes buscar ahora una solución que lo tenga en cuenta no lo soluciones para 3 niveles....
__________________
Con Microaplicaciones puedes hacer tu tienda en línea de forma sencilla y rápida, sin costos ocultos y con mucha responsabilidad.
  #4 (permalink)  
Antiguo 22/01/2014, 10:43
Avatar de xcars  
Fecha de Ingreso: mayo-2005
Ubicación: El Salvador
Mensajes: 753
Antigüedad: 18 años, 11 meses
Puntos: 4
Respuesta: Problema ordenando datos en query

lastimosa no me funciono, creo que no se puede hacer en un solo query :( voy a tener que buscar otra solucion aunque implique programar mas... gracias por tu aporte!!!
__________________
Con Microaplicaciones puedes hacer tu tienda en línea de forma sencilla y rápida, sin costos ocultos y con mucha responsabilidad.
  #5 (permalink)  
Antiguo 23/01/2014, 04:50
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Problema ordenando datos en query

Se puede....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #6 (permalink)  
Antiguo 23/01/2014, 09:58
Avatar de xcars  
Fecha de Ingreso: mayo-2005
Ubicación: El Salvador
Mensajes: 753
Antigüedad: 18 años, 11 meses
Puntos: 4
Respuesta: Problema ordenando datos en query

jeje si me das una luz te lo agradeceria...

Cita:
Iniciado por quimfv Ver Mensaje
Se puede....
__________________
Con Microaplicaciones puedes hacer tu tienda en línea de forma sencilla y rápida, sin costos ocultos y con mucha responsabilidad.
  #7 (permalink)  
Antiguo 24/01/2014, 07:31
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Problema ordenando datos en query

Es que no lo tengo aqui... esta tarde espero acordarme....si no manda me un privado.... para que te conteste por aqui.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #8 (permalink)  
Antiguo 25/01/2014, 05:03
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Problema ordenando datos en query

Siento haberte hecho perder el tiempo.... pensaba que lo tenia solucionado solo con un order by pero veo que no.

Yo uso una query ordenada como sigue

Código MySQL:
Ver original
  1. ...order by nivel,padre,orden;

y apartir de ella con programación externa obengo el orden que pedias.

La programación externa es off topic en este foro... pero espero que explicar la estrategia seguida no lo sea....

Vamos a crear un ArrayDef con el orden buscado

Código pre:
Ver original
  1. ArrayDef = array() fuera del bucle
  2. Inicio Bucle sobre los registros en el orden anterior
  3.  
  4.      Declaro ArrayBefore y ArrayAfter
  5.      Si RegistroActual.padre=0  
  6.          inserto RegistroActual en la última posición del ArrayDef
  7.      Si RegistroActual.padre<>0
  8.          Inicio bucle sobre ArrayDef
  9.              leo ArrayDef hasta encontrar al padre y/o un hermano de orden inferior
  10.                      los guardo en ArrayBefore,
  11.              luego sigo leyendo ArrayDef hasta el final
  12.                      los guardo en ArrayAfter
  13.          loop
  14.          Redeclaro ArrayDef=array() (se queda vacia)
  15.          Inserto en ArrayDef
  16.              ArrayBefore, RegistroActual, ArrayAfter
  17.      fin si
  18. loop

Padre es cero cuando no hay un progenitor....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 25/01/2014 a las 05:27
  #9 (permalink)  
Antiguo 25/01/2014, 19:25
Avatar de Djoaq  
Fecha de Ingreso: septiembre-2012
Ubicación: Barcelona
Mensajes: 271
Antigüedad: 11 años, 6 meses
Puntos: 38
Respuesta: Problema ordenando datos en query

Cita:
Iniciado por xcars Ver Mensaje
Saludos amigos, posiblemente sea algo sencillo, pero nose si sera que mi cabeza no computa pero no le he podido encontrar solucion, talvez me ayuden a encontrar una luz o una solucion.

Tengo una tabla de categorias que será recursiva para tener categorias padres e hijos, es decir, CATEGORIA_PADRE1 puede tener hijos y nietos. Por el momento, solo seran tres niveles, es decir padre,hijo,nieto pero queda la posibilidad de que sean mas niveles, aunque de eso me preocupo despues.
La tabla ademas tiene un campo de ordenacion interno, es decir, del padre1 como quiero que queden ordenados los hijos y de los hijos tambien puedo definir como quiero que queden ordenados los nietos.

El punto es que necesito hacer un query que obtenga el listado de categoria_id y categoria _nombre ordenado por padre, hijos, nietos en el orden del campo de ordenacion, ej:
Categoria Padre: Bienes y raices
hijo1: Compra y Venta (campo orden=1)
hijo2: Alquileres (campo orden=2)
hijo3: Otros (campo orden=3)

el hijo1 del hijo1: Casas (campo orden=1)
el hijo 2 del hijo1: Apartamentos (campo orden=2)
el hijo 3 del hijo1: otros en compra y venta(campo orden=3)

el hijo1 del hijo2: Casas (campo orden=1)
el hijo2 del hijo2: Apartamentos (campo orden=2)
el hijo3 del hijo2: Otros Alquileres(campo orden=3)

Y el resultado que busco del query ordenado seria:

Bienes y Raices
Compra y Venta
Casas
Apartamentos
Otros en compra y venta
Alquileres
Casas
Apartamentos
Otros Otros Alquileres
Otros (ojo este es el hijo3 del padre)

La estructura de la tabla es la siguiente:
Código MySQL:
Ver original
  1. CREATE TABLE `categorias` (
  2.     `categoria_id` INT(11) NOT NULL AUTO_INCREMENT,
  3.     `categoria_nombre` VARCHAR(75) NULL DEFAULT NULL,
  4.     `parent_id` INT(11) NULL DEFAULT NULL,
  5.     `categoria_descripcion` TEXT NULL,
  6.     `categoria_estado_id` ENUM('Activo','Inactivo') NULL DEFAULT NULL,
  7.     `categoria_precio` ENUM('Si','No') NULL DEFAULT 'Si',
  8.     `categoria_articulo` ENUM('Si','No') NULL DEFAULT 'Si',
  9.     `posicion_orden` TINYINT(4) NULL DEFAULT '1',
  10.     PRIMARY KEY (`categoria_id`),
  11.     INDEX `codigo_cat` (`categoria_id`)
  12. )

Y el query que tengo y que no funciona es
Código MySQL:
Ver original
  1. SELECT parent_id,categoria_id,categoria_nombre,posicion_orden FROM categorias ORDER BY parent_id ASC,posicion_orden

Alguien me podria dar una luz de como ordenar de esa manera o que podria hacer para lograr dicho resultado.

De antemano gracias por sus ayudas y aportes.
Buenas noches!! la verdad es que estoy muy espeso ya a estas horas!!

No se si he entendido bien lo que quieres , seria ordenar por una serie de registros? bueno yo en su día tuve un problema parecido ! entonces lo que hice fue esto :
Código MySQL:
Ver original
  1. SELECT MASTER_id_.*,
  2.     informecomer_.cif,
  3.     informecomer_.nombre_agencia,
  4.     informecomer_.fecha_fin,
  5.     informecomer_.tipo_serv,
  6.     CASE informecomer_.tipo_serv
  7.             WHEN "Microsites" THEN 1
  8.             WHEN "Pack Pro 5" THEN 2
  9.             WHEN "Pack Pro 10" THEN 3
  10.             WHEN "Pack Pro 20" THEN 4
  11.             WHEN "Pack Pro 50" THEN 5
  12.             WHEN "Pack Pro 100" THEN 6
  13.             WHEN "Pack Pro 200" THEN 7
  14.             WHEN "Pack pro -1" THEN 8
  15.                 ELSE "9"
  16.                     END AS "Contador",
  17.     informecomer_.id
  18.    
  19.    
  20.             FROM master_id_,informecomer_
  21.            
  22.                     WHERE master_id_.ID_BO = informecomer_.id
  23.                            
  24.                             ORDER BY contador ASC

Es solo para ver si te inspiro...

Yo diría que creo que lo que quieres hacer le pinta mas a una select que a un order by!

Saludo!
  #10 (permalink)  
Antiguo 11/02/2014, 03:51
 
Fecha de Ingreso: septiembre-2005
Mensajes: 522
Antigüedad: 18 años, 7 meses
Puntos: 0
Respuesta: Problema ordenando datos en query

Cita:
Iniciado por quimfv Ver Mensaje
Siento haberte hecho perder el tiempo.... pensaba que lo tenia solucionado solo con un order by pero veo que no.

Yo uso una query ordenada como sigue

Código MySQL:
Ver original
  1. ...order by nivel,padre,orden;

y apartir de ella con programación externa obengo el orden que pedias.

La programación externa es off topic en este foro... pero espero que explicar la estrategia seguida no lo sea....

Vamos a crear un ArrayDef con el orden buscado

Código pre:
Ver original
  1. ArrayDef = array() fuera del bucle
  2. Inicio Bucle sobre los registros en el orden anterior
  3.  
  4.      Declaro ArrayBefore y ArrayAfter
  5.      Si RegistroActual.padre=0  
  6.          inserto RegistroActual en la última posición del ArrayDef
  7.      Si RegistroActual.padre<>0
  8.          Inicio bucle sobre ArrayDef
  9.              leo ArrayDef hasta encontrar al padre y/o un hermano de orden inferior
  10.                      los guardo en ArrayBefore,
  11.              luego sigo leyendo ArrayDef hasta el final
  12.                      los guardo en ArrayAfter
  13.          loop
  14.          Redeclaro ArrayDef=array() (se queda vacia)
  15.          Inserto en ArrayDef
  16.              ArrayBefore, RegistroActual, ArrayAfter
  17.      fin si
  18. loop

Padre es cero cuando no hay un progenitor....



Hola,

yo lo he solucionado de esta forma aunque, hay el peligro de cuantas más carpetas más bucles:


Cita:
Editado: Código de programación no permitido en foros de Bases de Datos.
Leer las normas del foro, por favor.

Última edición por gnzsoloyo; 11/02/2014 a las 03:57
  #11 (permalink)  
Antiguo 11/02/2014, 05:16
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Problema ordenando datos en query

No vemos tu solución pero la que te proponia yo no aumenta el numero de bucles con la
"profundidad" de la recursibidad. Y si eso es un problema ya que se puede bloquear todo.

Ahora bien si son carpetas reales del servidor quizas la solución es leer la estructura del disco.... pero tratemoslo, si quieres, en php.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Etiquetas: campo, null, query, select, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:03.