agrupar por intervalos de fechas mysql

NeB1

Para hacer una gráfica de lineas en un intervalo temporal, digamos que con unos 30 puntos en el eje de las X, por ejemplo:

[del 1 al 20 de Enero] [ del 21 Enero al 10 febrero] ... y así 30 más xD

(por ejemplo, esto dependerá del rango de fechas que elige el usuario.

como lo haceis vosotros? hay forma de que te saque todo esto de una consulta?, del rollo

SELECT COUNT(descargas)
FROM
productos
GROUP BY intervalos_de_x_dias

Es que hasta ahora para este tipo de gráficas hago mazo de consultas, y estoy convencido que tiene que haber algo más eficiente.

Si me podeis dar la respuesta tanto en mysql como en SqlCompact os querré mucho

cabron

No se me da bien optimizar queries así que no sabría decirte que rendimiento te daría lo que te propongo, pero para recuperarlo todo en una sola query puedes generar el sql de forma dinámica para que te cree el where según lo que meta el tipo, ej si pone del 1 al 5 de enero, del 3 al 9 de marzo, generas esto:

where columna_fecha between '2010-01-01' and '2010-01-05' or columna_fecha between '2010-04-03' and '2010-04-09'

Básicamente añades un "or columna_fecha between" por cada rango que te ponga. Además antes de generarlo puedes comprobar si te ha puesto dos rangos que tienen días adyacentes, ej: del 1 de enero al 9 de enero, del 10 de enero al 20 de enero, te puedes ahorrar un or poniendo directamente del 1 de enero al 20 de enero.

Con eso lo recuperas todo en una sola query y ya te olvidas de la bbdd, una vez tengas todos los resultados en memoria ya tendrías que recorrerlos con cada intervalo de fecha para mostrar cada grupo donde corresponda.

NeB1

pero entonces, al hacer un count con ese where, solo me devolverá 1 resultado que será el total de descargas en esas fechas, ¿no?.

El tema es que tengo que sacar el total de descargas para cada intervalo

cabron

Um, vale, he entendido que querías hacer algo diferente... lo que quieres es: del 4 al 5 de enero 30 descargas en total, del 9 al 10 de febrero 50 descargas en total, ¿no?

NeB1

#4 sasto

si hiciera

GROUP BY DATE(fecha)

creo que me devolvería las descargas por día, pero tmb quiero agrupar por intervalor de fecha

cabron

Pues con grupo by me parece la forma más sencilla de hacerlo, lo único que no todo el proceso lo hace la bbdd, tu aplicación tendrá que hacer un poco, pero vamos que es algo sin mucha historia. Recuperas el count y la fecha, le metes el group by para tener las descargas de cada día y un having para recuperar solo los días que te interesa, y el resto lo procesas ya en tu aplicación, piensa que teniendo como resultado la fecha, y el número de descargas que hubo en esa fecha, solo tienes que ir recorriendo de forma secuencial la lista de resultados sumando todas las descargas de cada día hasta que llegues a la fecha fin del primer intervalo. A partir de ahí usas otro contador diferente y sigues sumando hasta el próximo intervalo, y así hasta tener todos.

NeB1

#6 así es como lo hago :P era por saber si existía una forma más automatizada, no sé, me costaba creer que no tuviese algo así prefabricado mysql.

Gracias de todas formas!

Usuarios habituales

  • NeB1
  • cabron