2012-03-04 8 views
7

que tratar de obtener el recuento de uva en las fechas 1 de Marzo - 3.dinámicamente la creación de períodos de fecha utilizando MySQL

enter image description here

Usted se dará cuenta de que el 2 de marzo - no hay uvas insertados ..

I'st posible mostrar una consulta de fechas 1 de marzo de 2 y 3, pero mostrando 0 conteo para marzo 2 enter image description here

En esta imagen anterior sólo muestra las fechas en las que hay uvas ..

Aquí es MySQL Query

SELECT `fruitDate` , `fruitName` , COUNT(*) 
FROM `tbl_fruits` 
WHERE `fruitName` = "Grapes" 
GROUP BY `fruitDate 

ACTUALIZACIÓN 2:

El uso de esta consulta:

SELECT f.fruitDate, f.fruitName, f1.count FROM tbl_fruits f 
    LEFT JOIN (SELECT fruitDate, COUNT(*) as count from tbl_fruits d WHERE d.fruitName='Grapes' GROUP BY d.fruitDate) as f1 ON (f.fruitDate = f1.fruitDate) 
    GROUP BY f.fruitDate 

Tengo este result..but su fruit..something diversa dsplaying mal con mi ¿consulta?

enter image description here

+0

Si no hubiera ninguna entrada manzana, naranja ni de uva en el día 2 (un espacio) ... ¿cómo debería ser el resultado? –

+1

se muestra ningún nombre de fruta en el resultado y los valores nulos para el día 2 –

+0

Configuración de una tabla de dimensiones de tiempo en MySQL: http://www.joyofdata.de/blog/setting-up-a-time-dimension-table-in -mysql/ – Raffael

Respuesta

2

recuerde que hay una forma dinámica (y un poco feo) solución para la creación de un intervalo de fechas que no requiere la creación de una tabla:

select aDate from (
    select @maxDate - interval (a.a+(10*b.a)+(100*c.a)+(1000*d.a)) day aDate from 
    (select 0 as a union all select 1 union all select 2 union all select 3 
    union all select 4 union all select 5 union all select 6 union all 
    select 7 union all select 8 union all select 9) a, /*10 day range*/ 
    (select 0 as a union all select 1 union all select 2 union all select 3 
    union all select 4 union all select 5 union all select 6 union all 
    select 7 union all select 8 union all select 9) b, /*100 day range*/ 
    (select 0 as a union all select 1 union all select 2 union all select 3 
    union all select 4 union all select 5 union all select 6 union all 
    select 7 union all select 8 union all select 9) c, /*1000 day range*/ 
    (select 0 as a union all select 1 union all select 2 union all select 3 
    union all select 4 union all select 5 union all select 6 union all 
    select 7 union all select 8 union all select 9) d, /*10000 day range*/ 
    (select @minDate := '2001-01-01', @maxDate := '2002-02-02') e 
) f 
where aDate between @minDate and @maxDate 

Dependiendo de la longitud del intervalo de fechas que puede reducir la cantidad de resultados generados dinámicamente (10000 días significa más de 27 años de registros que representan cada uno un día) eliminando las tablas (d, c, by a) y quitándolas de la fórmula superior. Establecer las variables @minDate y @maxDate le permitirá especificar las fechas entre las cuales desea filtrar los resultados.

Editar:

Veo que todavía está buscando una solución. Prueba esto:

select c.date, f.fruitName, count(f.fruitName = 'Grapes') 
from tbl_calendar c 
left join tbl_fruits f 
on c.date = f.fruitDate and f.fruitName = 'Grapes' 
group by c.date, f.fruitName 

Si también desea filtrar las fechas adicionales de la tabla creada, utilice esta consulta:

select c.date, f.fruitName, count(f.fruitName = 'Grapes') 
from tbl_calendar c 
left join tbl_fruits f 
on c.date = f.fruitDate and f.fruitName = 'Grapes' 
group by c.date, f.fruitName 
having c.date between 
    (select min(fruitDate) from tbl_fruits) and 
    (select max(fruitDate) from tbl_fruits) 
+0

uh..this llagas en mi eyes..lol..i sabía esto, pero creo que esto es demasiado code..LOL..thanks todos modos/.i también puede utilizar esto en el futuro .. –

+0

me ha gustado su primera código. .pero devuelve un valor nulo si no hay uvas en la consulta ... ¿podemos mostrar Grapes en lugar de null? –

5

de marzo de datos 2 es que no existe en la tabla, ¿cuál sería elegir? Es decir, dado que count() cuenta el número de filas que existe para "Uvas" en cada fecha, y no existen filas para "Uvas" el 2 de marzo, count() no tiene datos para contar, nada que contarle al base de datos para interpolar las fechas faltantes.

Para resolver esto, lo que he hecho en el pasado es crear una tabla separada, Calendario, que contiene una fila para cada fecha para un rango determinado. Luego, puede JOIN en esta tabla para asegurarse de seleccionar una fila para cada fecha. Podría ser algo como esto:

SELECT cal.`Date`, 'Grapes' as `fruitName`, COUNT(f.`fruitName`) 
FROM `tbl_Calendar` cal 
LEFT JOIN `tbl_fruits` f ON cal.`Date` = f.`fruitDate` 
WHERE `fruitName` = "Grapes" 
AND '2012-03-01' <= cal.`Date` AND cal.`Date` <= '2012-03-03' 
GROUP BY cal.`Date` 

Tenga en cuenta que count(*) nunca regresaría 0 porque una fila sería devuelto para cada fecha. Para obtener un 0, contar un campo que sería NULL cuando se encuentran 0 filas, en este caso, cuento fruitName

La tabla de calendario podría ser tan simple como

CREATE TABLE tbl_Calendar (
    `Date` date NOT NULL PRIMARY KEY 
) 

Qué le llene con una simple bucle de PHP desde una fecha de inicio elegida hasta la fecha de finalización. Puede encontrar un beneficio al agregar otras columnas para almacenar en caché cosas como el día de la semana o las vacaciones, pero eso no es necesario para esta tarea.

EDITAR

En su edición, que parecen estar tratando de unirse de nuevo a sus frutas tabla para ver las fechas, pero hay algunos errores en la consulta, tratar en lugar de sustituir una sub consulta similar en lugar de mi mesa Calendario:

SELECT cal.`Date`, 'Grapes' as `fruitName`, COUNT(f.`fruitName`) 
FROM (SELECT `fruitDate` as `Date` FROM `tbl_fruits` GROUP BY `fruitDate`) cal 
LEFT JOIN `tbl_fruits` f ON cal.`Date` = f.`fruitDate` 
WHERE `fruitName` = "Grapes" 
GROUP BY cal.`Date` 

Tenga en cuenta, sin embargo, si bien esto se llenará en fechas que faltan para las uvas que no faltan para algunas otras frutas, que no se llenará en las fechas que faltan para todas las frutas.

+0

déjame probar este ... –

+0

¿Puedes decirme el nombre de la tabla y los campos que has creado en este ejemplo? Quiero replicar esto para usar este código ... –

+0

No estoy seguro de lo que quieres decir, quizás el trivial CREATE te ayude? – Umbrella

Cuestiones relacionadas