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

Obtener registros en un rango de datos

Estas en el tema de Obtener registros en un rango de datos en el foro de Mysql en Foros del Web. Hola a todos, Tengo la siguiente tabla: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original CREATE TABLE `precios` (   `producto` varchar ( 9 ) default NULL ...
  #1 (permalink)  
Antiguo 27/03/2012, 22:36
 
Fecha de Ingreso: marzo-2012
Mensajes: 6
Antigüedad: 12 años
Puntos: 1
Pregunta Obtener registros en un rango de datos

Hola a todos,

Tengo la siguiente tabla:

Código MySQL:
Ver original
  1. CREATE TABLE `precios` (
  2.   `producto` varchar(9) default NULL,
  3.   `precio` int(2) default NULL,
  4.   `year` int(4) default NULL,
  5.   `mes` int(1) default NULL,
  6.   `semana` int(1) default NULL
  7. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  8.  
  9. INSERT INTO `precios` (`producto`, `precio`, `year`, `mes`, `semana`) VALUES
  10. ('variedad4', 60, 2010, 2, 4),
  11. ('variedad1', 77, 2010, 3, 3),
  12. ('variedad5', 88, 2010, 3, 4),
  13. ('variedad5', 41, 2010, 3, 3),
  14. ('variedad2', 46, 2010, 4, 4),
  15. ('variedad4', 64, 2010, 4, 2),
  16. ('variedad3', 9, 2010, 5, 2),
  17. ('variedad2', 81, 2010, 5, 3),
  18. ('variedad2', 4, 2010, 6, 1),
  19. ('variedad3', 90, 2010, 6, 4),
  20. ('variedad5', 46, 2010, 7, 1),
  21. ('variedad3', 56, 2010, 7, 3),
  22. ('variedad4', 39, 2010, 7, 1),
  23. ('variedad1', 40, 2010, 8, 2),
  24. ('variedad5', 52, 2010, 8, 2),
  25. ('variedad1', 77, 2011, 3, 3),
  26. ('variedad3', 80, 2011, 3, 1),
  27. ('variedad3', 9, 2011, 3, 2),
  28. ('variedad2', 4, 2011, 3, 1),
  29. ('variedad2', 46, 2011, 4, 4),
  30. ('variedad5', 46, 2011, 4, 1),
  31. ('variedad3', 56, 2011, 4, 3),
  32. ('variedad1', 40, 2011, 4, 2),
  33. ('variedad3', 90, 2011, 6, 4),
  34. ('variedad4', 39, 2011, 7, 1),
  35. ('variedad5', 52, 2011, 8, 2),
  36. ('variedad2', 74, 2012, 3, 2),
  37. ('variedad1', 83, 2012, 3, 1),
  38. ('variedad1', 62, 2012, 3, 4);

Tengo que sacar los registros que existen entre un determinado dato cronologico, que no es exactamente una fecha (year1, mes1, semana1) y otro dato semejante (year2, mes2, semana2).

Logré identificar cada uno de los registros con una consulta, asi:

Código MySQL:
Ver original
  1. select @rownua:=@rownua+1 'num', year, mes, semana FROM precios , (SELECT @rownua:=0) a

pero al tratar de realizar algo como esta consulta ( select @rownum:=@rownum+1 'num', producto,year, mes, semana FROM precios , (SELECT @rownum:=0) r where 'num' between 23 and 28 )veo que los valores

Código MySQL:
Ver original
  1. select @rownum:=@rownum+1 'num', producto,year, mes, semana FROM precios , (SELECT @rownum:=0) r
  2. where 'num' between
  3. (select @rownua:=@rownua+1 'num1' FROM precios , (SELECT @rownua:=0) a  where year=2011 and mes=4 and semana=2)
  4. (select @rownub:=@rownub+1 'num2' FROM precios , (SELECT @rownub:=0) b  where year=2012 and mes=2 and semana=1)

el resultado es errado.

Agradezco de antemano su ayuda.

Saludos
  #2 (permalink)  
Antiguo 28/03/2012, 01:17
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Obtener registros en un rango de datos

El orden de entrada en una bbdd relacional es irelevante, luego por mucho que el insert este ordenado no puedes fiarte de que cuando se lea la bbdd se vaya a leer en el mismo orden.

Luego tu intento de agregar un numerador a los registros no tienes ninguna garantia de que funcione.

Para que funcionara deberías usar un ORDER BY para indicarle al motor en que orden quieres los registros....

apasar de ello creo que te estas complicando un poco la vida,


Código MySQL:
Ver original
  1. SELECT @rownum:=@rownum+1 'num',
  2.              producto,
  3.              YEAR,
  4.              mes,
  5.              semana
  6. FROM precios , (SELECT @rownum:=0) r
  7. WHERE YEAR>=YYYY1 AND YEAR<=YYYY2
  8.         AND mes>=MM1 AND mes<=MM2
  9.         AND semana>=SS1 AND semana<=SS2
  10. ORDER BY YEAR,mes,semana,producto;

donde

YYYYx son los años buscados (pueden ser iguales)
MMx idem para el mes
SSx idem para la semana

Si no lo necesitas puedes quitar el numerador...
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 28/03/2012, 01:42
 
Fecha de Ingreso: marzo-2012
Mensajes: 6
Antigüedad: 12 años
Puntos: 1
Pregunta Respuesta: Obtener registros en un rango de datos

Cita:
Iniciado por quimfv Ver Mensaje
El orden de entrada en una bbdd relacional es irelevante, luego por mucho que el insert este ordenado no puedes fiarte de que cuando se lea la bbdd se vaya a leer en el mismo orden.

Luego tu intento de agregar un numerador a los registros no tienes ninguna garantia de que funcione.

Para que funcionara deberías usar un ORDER BY para indicarle al motor en que orden quieres los registros....

apasar de ello creo que te estas complicando un poco la vida,


Código MySQL:
Ver original
  1. SELECT @rownum:=@rownum+1 'num',
  2.              producto,
  3.              YEAR,
  4.              mes,
  5.              semana
  6. FROM precios , (SELECT @rownum:=0) r
  7. WHERE YEAR>=YYYY1 AND YEAR<=YYYY2
  8.         AND mes>=MM1 AND mes<=MM2
  9.         AND semana>=SS1 AND semana<=SS2
  10. ORDER BY YEAR,mes,semana,producto;

donde

YYYYx son los años buscados (pueden ser iguales)
MMx idem para el mes
SSx idem para la semana

Si no lo necesitas puedes quitar el numerador...
Hola quimfv,

Gracias por tu respuesta.

Sólo hay un inconveniente respecto a los meses y semanas, en algunas ocasiones la primera "fecha" puede ser por ejemplo year =210 mes =8 semana=4 y la segunda year=2011 mes=3 semana= 1. En ese caso no puedo comparar mes con mes y semana con semana.

Esa es la razon del contador y tienes razon frente a la falta del orden by, pero no se si estoy errado, me parece que necesitaría capturar la identificacion de cada limite del rango para poder saber cuales son los registros del rango.

Cualquier idea que se les ocurra es bienvenida.

Saludos,
  #4 (permalink)  
Antiguo 28/03/2012, 06:28
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Obtener registros en un rango de datos

Tienes razon!!!

CONCAT_WS('/',YEAR,if(mes<10,'0',''),mes,semana)

esto construirá algo asi 2010/08/1 que puedes comparar com YYYY1/MM1/S1 y con YYYY2/MM2/S2


Código MySQL:
Ver original
  1. SELECT @rownum:=@rownum+1 'num',
  2.              producto,
  3.              YEAR,
  4.              mes,
  5.              semana
  6. FROM precios , (SELECT @rownum:=0) r
  7. WHERE CONCAT_WS('/',YEAR,if(mes<10,'0',''),mes,semana)>='YYYY1/MM1/S1'
  8. AND CONCAT_WS('/',YEAR,if(mes<10,'0',''),mes,semana)<='YYYY2/MM2/S2'
  9. ORDER BY CONCAT_WS('/',YEAR,if(mes<10,'0',''),mes,semana),producto;

Ten en cuenta que el mes (MM1 o MM2) debe llevar el cero a la izquierada si es anterior a octubre....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 28/03/2012 a las 06:34

Etiquetas: rango, 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

SíEste tema le ha gustado a 2 personas




La zona horaria es GMT -6. Ahora son las 19:59.