optimisation de requéte - SQL/NoSQL - Programmation
MarshPosté le 26-04-2008 à 11:54:07
Bonjour.
Travaillant actuellement sur le développement de la partie statistique d'un back-office, je n'arrive pas à trouver la requête miracle qui m'évitera d'avoir à procéder par étapes.
But recherché: savoir, parmi les clients qui ont commandés sur un mois donné, ceux qui en sont à leur première commande, ceux qui en sont à leur 2e, à leur 3e, à leur 4e ou à 5 et +.
Actuellement, je procéde ainsi
SELECT a.id_client, COUNT( DISTINCT b.id_commande ) AS nb_commandes FROM commande a INNER JOIN commande b ON ( a.id_client = b.id_client AND b.date_commande < "2008-04-01 00:00:00" ) WHERE a.date_commande BETWEEN "2008-03-01 00:00:00" AND "2008-03-31 23:59:59" GROUP BY a.id_client HAVING nb_commandes=1
pour connaitre les clients ayant commandés en mars qui n'en sont qu'à leur première commande, puis je regarde le nombre de réponses retournées (j'ai bien essayé d'envelopper la requéte dans un SELECT COUNT() général, mais j'ai un message d'erreur et passe donc par l'instruction php mysql_num_rows).
Comme je veux 5 nombres, je répéte l'opération 5 fois, en changeant chaque fois la condition de mon
HAVING nb_commandes
Y'aurait-il moyen d'optimiser tout ça pour obtenir le résultat souhaité en une seule et unique requéte?
Merci d'avance.
P.S.: le serveur est en MySQL 4.0.2, donc sous-requétes impossibles.
Marsh Posté le 26-04-2008 à 11:54:07
Bonjour.
Travaillant actuellement sur le développement de la partie statistique d'un back-office, je n'arrive pas à trouver la requête miracle qui m'évitera d'avoir à procéder par étapes.
But recherché: savoir, parmi les clients qui ont commandés sur un mois donné, ceux qui en sont à leur première commande, ceux qui en sont à leur 2e, à leur 3e, à leur 4e ou à 5 et +.
Actuellement, je procéde ainsi
SELECT a.id_client, COUNT( DISTINCT b.id_commande ) AS nb_commandes
FROM commande a
INNER JOIN commande b ON ( a.id_client = b.id_client
AND b.date_commande < "2008-04-01 00:00:00" )
WHERE a.date_commande
BETWEEN "2008-03-01 00:00:00"
AND "2008-03-31 23:59:59"
GROUP BY a.id_client
HAVING nb_commandes=1
pour connaitre les clients ayant commandés en mars qui n'en sont qu'à leur première commande, puis je regarde le nombre de réponses retournées (j'ai bien essayé d'envelopper la requéte dans un SELECT COUNT() général, mais j'ai un message d'erreur et passe donc par l'instruction php mysql_num_rows).
Comme je veux 5 nombres, je répéte l'opération 5 fois, en changeant chaque fois la condition de mon
HAVING nb_commandes
Y'aurait-il moyen d'optimiser tout ça pour obtenir le résultat souhaité en une seule et unique requéte?
Merci d'avance.
P.S.: le serveur est en MySQL 4.0.2, donc sous-requétes impossibles.