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

Consulta a dos columnas

Estas en el tema de Consulta a dos columnas en el foro de Mysql en Foros del Web. Hola Maestros Tengo el siguiente problema. Necesito hacer una consulta en una tabla donde tiene dos columnas que son nº de partes, en la primera ...
  #1 (permalink)  
Antiguo 26/07/2010, 13:09
 
Fecha de Ingreso: abril-2003
Mensajes: 201
Antigüedad: 21 años
Puntos: 0
Consulta a dos columnas

Hola Maestros
Tengo el siguiente problema.

Necesito hacer una consulta en una tabla donde tiene dos columnas que son nº de partes, en la primera columna aparece el nº de parte, el cual puede cambiar a otro nº parte y se guarda en la segunda columna CAMBIA (los nº de parte puede cambiar hasta 10 veces). Ejemplo:
Código:
DESCRIPCION	Nº PARTE	CAMBIA
RODAMIENTO	30-62699	30-20839
RODAMIENTO	30-20839	30-20839T
RODAMIENTO	30-20839T	NULL
Entonces la consulta que debo hacer es buscar en la columna Nº PARTE y buscar si ha cambiado de numero de parte, osea, si busco el nº parte 30-20839T ó el 30-62699 me arroje el siguiente resultado:
Código:
Nº PARTE
30-62699
30-20839
30-20839T
Mostrandome el 30-20839T como ultimo nº de parte, ya que no ha cambiado y jeraquicanente como cambio el nº de parte (desde el 30-6299 hasta el 30-20839T)

Si alguien puede decirme si esto se puede lograr con una consulta o debo buscar como hacerlo con PHP.

Muchas Gracias
  #2 (permalink)  
Antiguo 27/07/2010, 02:55
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Consulta a dos columnas

Código MySQL:
Ver original
  1. SELECT TuTabla.parte
  2. FROM TuTabla
  3. ORDER BY If(TuTabla.cambia IS NULL,1,0), TuTabla.cambia;

Creo que esto te puede servir.

Quim
  #3 (permalink)  
Antiguo 27/07/2010, 03:17
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Consulta a dos columnas

Creo que buscas hacer una consulta sobre una base en alguna medida jerárquica, para lo cual debes hacer self-join, es decir, unir la tabla consigo misma. Mira esto. Lo he hecho sobre un supuesto de tres niveles, pero si puede llegar hasta 10 tendrás que hacerlo hasta t10. Como el orden en que se almacenan los datos y la propia unión se corta cuando aparece el NULL, no creo que sea necesario hacer nada más. He llamado a tu tabla tabla y al campo Nº PARTE NPARTE para evitar tener que escribir `Nº PARTE`. Puedes buscar cualquiera de los NPARTE y te encontrará todos los niveles.

SELECT t1.NPARTE, t2.NPARTE, t3.NPARTE FROM `tabla` t1 LEFT JOIN tabla t2 ON t1.CAMBIA = t2.NPARTE LEFT JOIN tabla t3 ON t2.CAMBIA = t3.NPARTE WHERE (t1.NPARTE ="30-62699" OR t2.NPARTE = "30-62699" OR t3.NPARTE = "30-62699")

Última edición por jurena; 27/07/2010 a las 03:52
  #4 (permalink)  
Antiguo 27/07/2010, 13:09
 
Fecha de Ingreso: abril-2003
Mensajes: 201
Antigüedad: 21 años
Puntos: 0
Respuesta: Consulta a dos columnas

Se me pego el pc con la consulta de jurema:

SELECT t1.NPARTE, t2.NPARTE, t3.NPARTE FROM `tabla` t1 LEFT JOIN tabla t2 ON t1.CAMBIA = t2.NPARTE LEFT JOIN tabla t3 ON t2.CAMBIA = t3.NPARTE WHERE (t1.NPARTE ="30-62699" OR t2.NPARTE = "30-62699" OR t3.NPARTE = "30-62699")

La de quimfv
Simplemente no la entiendo :(

la tabla pesa mas de 35mb, no tiene PK, como la puedo optimizar?
poniendole una PK andaría mas rápido¿? aunque no pueda vincularla de ninguna forma con esa PK con otras tablas (son mas 180.000 registros...)

los nº de parte tiene espacio por ejemplo 15002 A2 , hay alguna forma de quitar los espacio entre el nº parte, para que quede 15002A2, vi que existe la funcion trim, pero es para los espacios que estan en el inicio y final....

Gracias jurema y quimfv
  #5 (permalink)  
Antiguo 27/07/2010, 14:23
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Consulta a dos columnas

si sólo tienes espacios entre el número y los otros caracteres,usas
UPDATE tutabla SET `nº parte` = replace(`nº parte`," ","")

En cuanto a índices, podrías indexar los campos nº parte y cambia. Eso mejoraría mucho la velocidad de la consulta. Por lo demás, debías mostrarnos la consulta que has lanzado. Los LEFT JOIN y el SELF-JOIN hacen pesada la consulta, pero eso es inevitable si quieres sacar los datos tal y como los tienes estructurados.
  #6 (permalink)  
Antiguo 28/07/2010, 09:02
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Consulta a dos columnas

Mi consulta lo único que hace es ordenar por el campo CAMBIA pero forzando que cuando este sea nulo aparezca al final de la ordenación, se convierte el nulo en 1 y el no nulo en 0 con lo que consigues que los nulos aparezcan después de los no nulos....

If(TuTabla.cambia IS NULL,1,0)

con los datos de ejemplo da exactamente lo que pides....

Con mas datos seguramente no obtendrás lo que buscas, la respuesta quizás fue demasiado rápida, funcionaria si como en el ejemplo tenemos la "vida" de un solo parte.




DESCRIPCION NPARTE CAMBIA
RODAMIENTO 30-62699 30-20839
RODAMIENTO 30-20839 30-20839T
RODAMIENTO 30-20839T
RODAMIENTO 30-62700 30-20840
RODAMIENTO 30-20840





NPARTE CAMBIA
30-62699 30-20839
30-20839 30-20839T
30-62700 30-20840
30-20840
30-20839T


Introduciendo mas datos no da lo esperado...


La solución de jurena si la desarrollas hasta los 10 posibles cambios te dará lo que buscas en un registro (no en columna, eso seria un problema menor) pero solo para un parte dado, no para la tabla entera... y si el máximo de 10 cambios es un máximo aproximado, es decir que rara vez se superen los 10 cambios esa rara vez no te dará lo que buscas...

Sin haber dado muchas vueltas al tema y con el diseño que tienes, la de jurena, es quizás la única solución, desarrollada hasta los 10 cambios y indexando los campos nparte y cambia por separado o juntos en un índice compuesto.... habría que ver como responde... recuerda que puedes forzar el uso de índices 12.2.8.2. Index Hint Syntax

Código MySQL:
Ver original
  1. SELECT t1.NPARTE, t2.NPARTE, t3.NPARTE, t4.NPARTE, t5.NPARTE, t6.NPARTE, t7.NPARTE, t8.NPARTE, t9.NPARTE, t10.NPARTE
  2. FROM (((((((((tabla AS t1 LEFT JOIN tabla AS t2 ON t1.CAMBIA = t2.NPARTE)
  3.  LEFT JOIN tabla AS t3 ON t2.CAMBIA = t3.NPARTE)
  4. LEFT JOIN Tabla t4 ON t3.CAMBIA = t4.NPARTE)
  5. LEFT JOIN Tabla t5 ON t4.CAMBIA = t5.NPARTE)
  6. LEFT JOIN Tabla t6 ON t5.CAMBIA = t6.NPARTE)
  7. LEFT JOIN Tabla t7 ON t6.CAMBIA = t7.NPARTE)
  8. LEFT JOIN Tabla t8 ON t7.CAMBIA = t8.NPARTE)
  9. LEFT JOIN Tabla t9 ON t8.CAMBIA = t9.NPARTE)
  10. LEFT JOIN Tabla t10 ON t9.CAMBIA = t10.NPARTE)
  11. WHERE (((t1.NPARTE)="30-62699"));

t1.NPARTE t2.NPARTE t3.NPARTE t4.NPARTE t5.NPARTE t6.NPARTE t7.NPARTE t8.NPARTE...
30-62699 30-20839 30-20839T


Si eliminas el WHERE para obtener toda la tabla daria esto

t1.NPARTE t2.NPARTE t3.NPARTE t4.NPARTE t5.NPARTE t6.NPARTE t7.NPARTE t8.NPARTE...
30-62699 30-20839 30-20839T
30-20839 30-20839T
30-20839T
30-62700 30-20840
30-20840


Suerte


Quim

Última edición por quimfv; 28/07/2010 a las 09:19
  #7 (permalink)  
Antiguo 28/07/2010, 09:05
 
Fecha de Ingreso: abril-2003
Mensajes: 201
Antigüedad: 21 años
Puntos: 0
Respuesta: Consulta a dos columnas

Cita:
Iniciado por jurena Ver Mensaje
si sólo tienes espacios entre el número y los otros caracteres,usas
UPDATE tutabla SET `nº parte` = replace(`nº parte`," ","")

En cuanto a índices, podrías indexar los campos nº parte y cambia. Eso mejoraría mucho la velocidad de la consulta. Por lo demás, debías mostrarnos la consulta que has lanzado. Los LEFT JOIN y el SELF-JOIN hacen pesada la consulta, pero eso es inevitable si quieres sacar los datos tal y como los tienes estructurados.
De lujo jurena, aplique el REPLACE y vi el asunto de los indices y se redujo a 0 seg las consultas :)

El asunto de los cambios de nº de parte lo pude probar (ahora que no se pega el pc)
Código MySQL:
Ver original
  1.   t1.Nparte,
  2.   t2.Nparte,
  3.   t3.Nparte
  4.   pricebook t2
  5.   LEFT OUTER JOIN pricebook t1 ON (t1.NparteCambia = t2.Nparte)
  6.   LEFT OUTER JOIN pricebook t3 ON (t2.NparteCambia = t3.Nparte)
  7.   t1.Nparte = '18842M' OR
  8.   t2.Nparte = '18842M' OR
  9.   t3.Nparte = '18842M'

Claro que se demora como 9 seg (2 rows fetched (9,422 sec)) :(

Ahi alguna manera de optimizar eso?

Muchas GRacias
  #8 (permalink)  
Antiguo 28/07/2010, 12:45
 
Fecha de Ingreso: abril-2003
Mensajes: 201
Antigüedad: 21 años
Puntos: 0
Respuesta: Consulta a dos columnas

Muchas Gracias Quim, funciona super rapido O_O...
Ahora me queda solo una duda, cuando meto un nº de parte que no cambio, no me aparecen resultados de los nº de parte anteriores, osea, considerando que el 30-20839T es el ultimo, no hay resultado... Osea se podría buscar hacia atras, osea el 30-20839 , 30-62699??

Estoy muy agradecido por sus repuestas, me han ayudado un montón
Gracias
  #9 (permalink)  
Antiguo 29/07/2010, 00:33
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Consulta a dos columnas

No entiendo bien, pero piensa que si no cambia, no puede tener nº de parte anteriores.
Y si es consecuencia de cambio, como 30-29839T si lo buscas en todos los lugares como te dijimos aparecerá en el último y con todos sus anteriores.
  #10 (permalink)  
Antiguo 29/07/2010, 08:12
 
Fecha de Ingreso: abril-2003
Mensajes: 201
Antigüedad: 21 años
Puntos: 0
Respuesta: Consulta a dos columnas

Sip, era solo para mostrar que el nº de parte ha tenido variaciones anteriores, pero bueno, ya estoy bien con todo lo que me ayudaron

Muchas Gracias
  #11 (permalink)  
Antiguo 29/07/2010, 09:05
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Consulta a dos columnas

Dinos de manera concreta, con datos y un ejemplo, lo que quieres y tal vez podamos proponerte alguna otra consulta.

Etiquetas: columnas, dos
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 18:41.