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

Seleccionar los tres ultimos meses de cada registro repetido en UNA tabla

Estas en el tema de Seleccionar los tres ultimos meses de cada registro repetido en UNA tabla en el foro de Mysql en Foros del Web. Estimados amigos, Necesito de vuestra ayuda para solucionar este problemilla. La duda es la siguiente: Tengo una tabla con estos registros TABLA |ID |TRAB |MES ...
  #1 (permalink)  
Antiguo 04/12/2008, 12:39
Avatar de a n g e l u s  
Fecha de Ingreso: enero-2006
Ubicación: Chile
Mensajes: 237
Antigüedad: 18 años, 3 meses
Puntos: 1
Pregunta Seleccionar los tres ultimos meses de cada registro repetido en UNA tabla

Estimados amigos,

Necesito de vuestra ayuda para solucionar este problemilla.

La duda es la siguiente:

Tengo una tabla con estos registros

TABLA
|ID |TRAB |MES |ANO |
|1 |6 |3 |2007 |
|2 |30 |7 |2008 |
|3 |44 |5 |2008 |
|4 |44 |7 |2008 |
|5 |2 |9 |2008 |
|6 |6 |4 |2007 |
|7 |7 |3 |2007 |
|8 |6 |7 |2007 |
|9 |30 |8 |2008 |
|10 |7 |9 |2008 |
|11 |44 |8 |2008 |
|13 |6 |8 |2008 |
|14 |6 |9 |2008 |


La consulta debiera devolver los tres últimos meses de cada TRAB si es que los tuviera, de esta manera:

RESULTADO
|ID |TRAB |MES |ANO |
|5 |2 |9 |2008 |
|14 |6 |9 |2008 |
|13 |6 |8 |2008 |
|8 |6 |7 |2007 |
|10 |7 |9 |2008 |
|7 |7 |3 |2007 |
|9 |30 |8 |2008 |
|2 |30 |7 |2008 |
|11 |44 |8 |2008 |
|4 |44 |7 |2008 |
|3 |44 |5 |2008 |

Les agradesco de antemano cualquier idea o ayuda que me puedan dar.

gracias.
__________________
Atte,
A n g e l u s
Concepción - Chile
más vale respuestas bien pensadas, que 7000 post
  #2 (permalink)  
Antiguo 05/12/2008, 06:58
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Seleccionar los tres ultimos meses de cada registro repetido en UNA tabla

No estoy seguro, no tengo mysql a mano para intentarlo pero podria ser algo así:

Código:
SELECT Sub.TRAB,Sub.MES,Sub.ANO
  FROM (SELECT DISTINCT Principal.TRAB, 
              (SELECT   Full1.MES
               FROM Full1
               where full1.trab=principal.trab
               ORDER BY Full1.TRAB, 
                                Full1.MES DESC , 
                                Full1.ANO DESC LIMIT 0,1) AS Mes,
              (SELECT  Full1.ANO
               FROM Full1
               where full1.trab=principal.trab
               ORDER BY Full1.TRAB, 
                                Full1.MES DESC , 
                                Full1.ANO DESC LIMIT 0,1) AS Anno
               FROM Full1 AS Principal
UNION ALL
(SELECT DISTINCT Principal.TRAB, 
              (SELECT   Full1.MES
               FROM Full1
               where full1.trab=principal.trab
               ORDER BY Full1.TRAB, 
                                Full1.MES DESC , 
                                Full1.ANO DESC LIMIT 1,1) AS Mes,
              (SELECT  Full1.ANO
               FROM Full1
               where full1.trab=principal.trab
               ORDER BY Full1.TRAB, 
                                Full1.MES DESC , 
                                Full1.ANO DESC LIMIT 1,1) AS Anno
               FROM Full1 AS Principal
UNION ALL
(SELECT DISTINCT Principal.TRAB, 
              (SELECT   Full1.MES
               FROM Full1
               where full1.trab=principal.trab
               ORDER BY Full1.TRAB, 
                                Full1.MES DESC , 
                                Full1.ANO DESC LIMIT 2,1) AS Mes,
              (SELECT  Full1.ANO
               FROM Full1
               where full1.trab=principal.trab
               ORDER BY Full1.TRAB, 
                                Full1.MES DESC , 
                                Full1.ANO DESC LIMIT 2,1) AS Anno
               FROM Full1 AS Principal) as Sub
ORDER BY Sub.TRAB, Sub.MES DESC , Sub.ANO DESC;
Puede haber algun lio de alias...???

Cmabia Full1 por el nombre de tu tabla, por supuesto.


Quim

Última edición por quimfv; 05/12/2008 a las 07:35
  #3 (permalink)  
Antiguo 05/12/2008, 07:06
Avatar de hshadow  
Fecha de Ingreso: abril-2008
Mensajes: 42
Antigüedad: 16 años
Puntos: 0
Respuesta: Seleccionar los tres ultimos meses de cada registro repetido en UNA tabla

Hola.

La verdad yo tampoco entendí la consulta MySQL de DBMark. Como dije antes ya tenía una forma pero iba a comerme mucha memoria en cuanto se hagan muchos resultados de entre los que buscar; pero como otra no me quedo lo hice con arrays (al menos hasta que sepa como filtrar los resultados con mysql). hice un "select *" con un "order by", meti los resultados en un array y los filtre con un "for" que vaya contando cuantas veces aparecia una propiedad de los elementos y no permitiendo a aquellos elementos que superaran la cantidad de veces que aparecio su propiedad (en este caso "propiedad" = usuario al que pertenece la imagen; elemento=imagen).

Hasta luego.
  #4 (permalink)  
Antiguo 08/12/2008, 12:20
Avatar de a n g e l u s  
Fecha de Ingreso: enero-2006
Ubicación: Chile
Mensajes: 237
Antigüedad: 18 años, 3 meses
Puntos: 1
Respuesta: Seleccionar los tres ultimos meses de cada registro repetido en UNA tabla

No me resulto, si tienen una nueva idea por favor agregenla.

gracias.
__________________
Atte,
A n g e l u s
Concepción - Chile
más vale respuestas bien pensadas, que 7000 post
  #5 (permalink)  
Antiguo 08/12/2008, 13:39
Avatar de a n g e l u s  
Fecha de Ingreso: enero-2006
Ubicación: Chile
Mensajes: 237
Antigüedad: 18 años, 3 meses
Puntos: 1
De acuerdo Respuesta: Seleccionar los tres ultimos meses de cada registro repetido en UNA tabla

SOLUCIONADO

Como necesito los tres ultimos meses, y no mas puedo llegar a una solucion rapida.

primero cree 3 funciones:

FUNCION MES1
BEGIN

DECLARE V1 INTEGER;
SELECT
rem.id
INTO
V1
FROM
tabla rem
WHERE
rem.id = var_princ AND
ORDER BY
rem.id,
rem.anyo_trab DESC,
rem.mes_trab DESC
LIMIT 1 ;

RETURN V1;
END

esta funcion se repite tres veces y lo unico que hay que cambiar es el LIMIT
MES1 - LIMIT 1
MES2 - LIMIT 1,1 ;
MES3 - LIMIT 2,1 ;


Luego cree un procedimiento almacenado que llama las funciones:

BEGIN

DROP TEMPORARY TABLE IF EXISTS tres_ultimos_meses;
CREATE TEMPORARY TABLE tres_ultimos_meses
SELECT *
FROM tabla rem
WHERE rem.id = var_id AND
rem.id IN(
MES1(var_princ, rem.id_trab_cont),
MES2(var_princ, rem.id_trab_cont),
MES3(var_princ, rem.id_trab_cont)
)
ORDER BY rem.id, rem.ano_trab DESC, rem.mes_trab DESC;

--> LLAMO A LA TABLA TEMPORAL PARA MOSTRARLA O TRABAJAR CON ELLA
select * from tres_ultimos_meses;


END


OJALA LES AYUDE Y SI TIENEN OTRA SOLUCION MEJOR BIENVENIDA.

cualquier duda les ayudo
__________________
Atte,
A n g e l u s
Concepción - Chile
más vale respuestas bien pensadas, que 7000 post
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 15:58.