2010-01-16 6 views
5

Je crée un graphique linéaire pour un rapport sur les ventes de produits à l'aide de l'API Google Chart et sépare les données par jour en exécutant la même requête dans une boucle pour chaque jour en utilisant UNION ALL comme colle.Optimisation de la requête MySQL pour l'extraction des données en utilisant la plage de temps

E.g. Un rapport pour une année entière répétera la requête, en utilisant UNION ALL 365 fois.

Je suppose que ce n'est pas un exemple de «meilleure pratique», donc si quelqu'un serait si gentil et me dirigerait dans la bonne direction pour optimiser cette requête, je l'apprécierais grandement.

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(....... 

Merci pour toutes les réponses rapides! Avec l'exemple de requête de jspcal, ma requête a fini comme ceci:

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 

Et avec PHP, je combine un tableau de plage de dates complète (correspondant à clés du tableau avec strtotime($data->day) du résultat de la requête) pour obtenir des jours sans vente.

+0

Peut-être que je manque s Quelque chose ici, mais pourquoi ne pas simplement exécuter une requête où créé> le début de votre plage de temps et

Répondre

1

vous pouvez regrouper par jour:

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 

relèverez la somme pour chaque jour de l'année dans l'ensemble de données

0

Vous Sould être en mesure 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') 

.... 

quelque chose comme

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') 
Questions connexes