2010-01-16 21 views
5

Estoy construyendo un gráfico de líneas para un informe de ventas del producto usando la API Google Chart y estoy separando los datos por día básicamente ejecutando la misma consulta en un ciclo para cada día usando UNION ALL como pegamento.Optimizar la consulta de MySQL para obtener datos usando el rango de tiempo

E.g. Un informe para todo un año repetirá la consulta, utilizando UNION ALL 365 veces.

Supongo que este no es el mejor ejemplo de práctica así que si alguien fuera tan amable y me señalara en la dirección correcta de cómo optimizar esta consulta, lo agradecería enormemente.

SELECT SUM(op.qty) AS qty 
    FROM uc_order_products op 
    LEFT JOIN uc_orders o ON o.order_id = op.order_id 
    LEFT JOIN node n ON n.nid = op.nid 
    LEFT JOIN node_type nt ON nt.type = n.type 
    WHERE (o.created > 1247695200) AND (o.created < 1247781600) 
    AND (o.order_status = 'completed') 
    AND (nt.type = 'book' OR nt.type = 'digital_movie') 

    UNION ALL 

    SELECT SUM(op.qty) AS qty 
    FROM uc_order_products op 
    LEFT JOIN uc_orders o ON o.order_id = op.order_id 
    LEFT JOIN node n ON n.nid = op.nid 
    LEFT JOIN node_type nt ON nt.type = n.type 
    WHERE (o.created > 1247781600) AND (o.created < 1247868000) 
    AND (o.order_status = 'completed') 
    AND (nt.type = 'book' OR nt.type = 'digital_movie') 

    UNION ALL 

    SELECT SUM(....... 

Gracias por todas las respuestas rápidas! Con el ejemplo de consulta de jspcal, mi consulta terminó así:

SELECT SUM(op.qty) AS qty, DATE_FORMAT(FROM_UNIXTIME(o.created),'%d-%m-%Y') AS day 
    FROM uc_order_products op 
    LEFT JOIN uc_orders o ON o.order_id = op.order_id 
    LEFT JOIN node n ON n.nid = op.nid 
    LEFT JOIN node_type nt ON nt.type = n.type 
    WHERE (o.created > 1247695200) AND (o.created < 1263596400) 
    AND (o.order_status = 'completed') 
    AND (nt.type = 'book' OR nt.type = 'digital_movie') 
    GROUP BY day 

Y con PHP, que combinan un (claves de matriz a juego con strtotime($data->day) del resultado de la consulta) completa gama intervalo de fechas para obtener días sin venta.

+0

Quizás me falta m aquí, pero ¿por qué no simplemente ejecutaste una consulta donde se creaba> el comienzo de tu rango de tiempo y

Respuesta

1

puede agrupar por día:

select sum(op.qty) as qty, date_format(o.created, '%Y-%m-%d') as day 
from ... where ... o.created >= subdate(now(), interval 1 year) and 
o.created <= now() group by day order by day 

va a reportar la suma para cada día del año en el conjunto de datos

0

Se deberán ser llenados capaz de convertir

WHERE (o.created > 1247695200) AND (o.created < 1247781600) 
AND (o.order_status = 'completed') 
AND (nt.type = 'book' OR nt.type = 'digital_movie') 


WHERE (o.created > 1247781600) AND (o.created < 1247868000)  
AND (o.order_status = 'completed')  
AND (nt.type = 'book' OR nt.type = 'digital_movie') 

.... 

a algo como

WHERE (
       (o.created > 1247695200) AND (o.created < 1247781600) 
      OR (o.created > 1247781600) AND (o.created < 1247868000) 
      ... 
     ) 
AND (o.order_status = 'completed') 
AND (nt.type = 'book' OR nt.type = 'digital_movie') 
Cuestiones relacionadas