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

SELECT con GROUP BY recursivo

Estas en el tema de SELECT con GROUP BY recursivo en el foro de Mysql en Foros del Web. Buenas gente del foro, vengo con una duda (mas que duda un problema) que espero que los mas avanzados en MySQL puedan ayudarme a arreglar, ...
  #1 (permalink)  
Antiguo 07/09/2012, 13:56
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 6 meses
Puntos: 320
Exclamación SELECT con GROUP BY recursivo

Buenas gente del foro, vengo con una duda (mas que duda un problema) que espero que los mas avanzados en MySQL puedan ayudarme a arreglar, el tema es el siguiente:

Tengo esta tabla:

----------------------------
IDT | NTM | EST |CTM
----------------------------

IDT -> ID Integer autoincrementado
NTM -> Nombre (Char)
EST -> Estado (Habilitado=1, Desabilitado=0)
CTM -> Asociacion con un IDT maestro o '0' si es maestro.

lo que quiero hacer es un SELECT que me traiga todos los registros con EST=1, de la siguiente forma:

IDT, NTM, CTM --->Categoria maestra1
IDT, NTM, CTM --->Asociado de categoria maestra1
IDT, NTM, CTM --->Asociado de categoria maestra1
IDT, NTM, CTM --->Categoria maestra2
IDT, NTM, CTM --->Asociado de categoria maestra2
IDT, NTM, CTM --->Asociado de categoria maestra2

CTM vale 0 si es maestro y sino tiene el valor del IDT al que esta asociado.

Se podra hacer con GROUP BY, no se podra, se ara de otra manera? que se les ocurre?
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #2 (permalink)  
Antiguo 07/09/2012, 14:13
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: SELECT con GROUP BY recursivo

Eso lo puedes hacer con Oracle, pero en MySQL no hay consultas recursivas de ese tipo.
Al menos, no se puede hacer con una cantidad indefinida de dependencias.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 07/09/2012, 14:19
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 6 meses
Puntos: 320
Respuesta: SELECT con GROUP BY recursivo

Cita:
Al menos, no se puede hacer con una cantidad indefinida de dependencias.
hola gnzsoloyo, gracias por responder.
solo tengo una dependencia. es decir, un solo escalon.
los que tienen 0, y los que apuntan a los que tienen 0, no tengo dependencias indefinidas.
(si es que entendi bien y te referias a que podia tener un maestro y a su vez ese otro y asi n veces) en mi caso solo hay dos tipos. los maestros y los esclavos de un maestro.
lo que si tengo es n maestros y m esclavos apuntando a ellos, por eso quiero hacer el select ordenado. se puede eso? o tendre que usar php para solventar el problema?
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #4 (permalink)  
Antiguo 07/09/2012, 14:49
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: SELECT con GROUP BY recursivo

Ahora estoy saliendo, pero te dejo la idea. Luego te doy un ejemplo:
Tienes que invocar dos veces a la misma tabla, con alias, y relacionar la segunda acon el primero usando LEFT JOIN.
Código MySQL:
Ver original
  1. FROM tabla1 T1 LEFT JOIN tabla1 T2 ON T1.id = T2.idpadre
  2. ORDER BY T1.id, T2.idpadre
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 08/09/2012, 00:16
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: SELECT con GROUP BY recursivo

Código MySQL:
Ver original
  1.    T1.NTM, IF( T1.CTM =0, T1.IDT, T1.CTM ) orden
  2.   FROM
  3.      tutabla T1
  4.    tutabla T2
  5.   ON
  6.       T1.IDT = T2.CTM
  7.      T1.IDT
  8.      orden, T1.CTM

Pero también tengo que hacerte una pregunta. ¿Por qué dejar una estructura jerárquica para una base que no parece que vaya a serlo? Una tabla categorías y una tabla subcategorías que dependen de las categorías, y un campo FKsubcat (o una tabla nueva subcatproducto) y tendrás lo mismo. Las consultas serán más fáciles, pero, claro, eso solo en el caso de que haya un único nivel y que cada categoría tenga al menos una categoría y todos los productos o lo que sean se relacionen con subcategoría. Ordenar sería más fácil, haciéndolo primero por cat y luego por subcat.

Última edición por jurena; 08/09/2012 a las 00:28
  #6 (permalink)  
Antiguo 08/09/2012, 11:53
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 6 meses
Puntos: 320
Respuesta: SELECT con GROUP BY recursivo

Cita:
Tienes que invocar dos veces a la misma tabla, con alias, y relacionar la segunda acon el primero usando LEFT JOIN.
Wow, nunca se me ubiese ocurrido :/ pense que talvez habria alguna instruccion que desconocia o algo asi, pero en fin, esos son los trucos que te da la experiencia supongo.

Código MySQL:
Ver original
  1.    T1.NTM, IF( T1.CTM =0, T1.IDT, T1.CTM ) orden
  2.   FROM
  3.      tutabla T1
  4.    tutabla T2
  5.   ON
  6.       T1.IDT = T2.CTM
  7.      T1.IDT
  8.      orden, T1.CTM

muchas gracias por el ejemplo!! lo adapte un poco para que no me traiga el campo orden y poder hacer luego un corte de control en php.

Código MySQL:
Ver original
  1. SELECT T1.NTM, T1.CTM
  2. FROM tmc T1
  3. LEFT JOIN tmc T2 ON T1.IDT = T2.CTM
  4. GROUP BY T1.IDT
  5. ORDER BY IF( T1.CTM =0, T1.IDT, T1.CTM ) , T1.CTM

Cita:
Pero también tengo que hacerte una pregunta. ¿Por qué dejar una estructura jerárquica para una base que no parece que vaya a serlo? Una tabla categorías y una tabla subcategorías que dependen de las categorías, y un campo FKsubcat (o una tabla nueva subcatproducto) y tendrás lo mismo. Las consultas serán más fáciles, pero, claro, eso solo en el caso de que haya un único nivel y que cada categoría tenga al menos una categoría y todos los productos o lo que sean se relacionen con subcategoría. Ordenar sería más fácil, haciéndolo primero por cat y luego por subcat.
veras, (no creas que no me lo he planteado) el tema es el siguiente, no son productos, son los tipos de movimientos posibles en un sistema de caja diaria, (como maximo habra 100 tipos por decir una locura) y gastar dos tablas para guardar en una 10 registros y en la otra 50 me parece un desproposito.

¿si son tipos de movimientos que es eso de categoria maestra, que nesesidad de hacer esto? podrias preguntarte, bien, es una cuestion estetica. los tipos los muestro en un <selecty> las categorias, osea los tipos maestros son los <optgroup> y los tipos comunes sus respectivos <option>.

muchas gracias por la ayuda con la consulta que publique (sin desmerecer para nada las suyas ya que es una adaptacion a mi caso particular) logre solucionarlo.

les dejo karmita a ambos XD jaja
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Etiquetas: group, recursivo, registros, 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 13:30.