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