optimisation requete SQL. GESTION DE STOCK LOCATION PHP

Petit nouveau ! | 1 Messages

12 déc. 2016, 16:05

je colle sur un problème .... depuis plusieurs mois.
ça fonctionne. c'est fiable. mais lent.

je ne parviens pas a trouver une alternative qui bouffe moins de ressource.
il s'agit d'un logiciel de gestion de stock de location.
je veux pouvoir voir à une plage de date (par exemple du 01/12/2016 au 20/12/2016) le matériel dispo

je simplifie ma BDD pour l'exemple :
TABLE PRODUITS :
produits_id, produits_reference

TABLE DOCUMENTS :
documents_id, datedebut, datefin

TABLE DOCUMENTS_LIGNES
lignes_id, documents_id, produits_id, lignes_quantite


SCRIPT PHP 1 simplifié, fonctionnel mais lent :
=> recherche du stock sortant pour 1 produits ($produits_id) sur une plage donnée ($datedebut à $datefin)
pour 1 produits donné il peut y en avoir 15 sorties le 01/12, 25 sorties 10/12 etc etc..
ceux qui m'interesse c'est donc la valeur maximale sortie sur une plage donnée

à savoir que mes tables peuvent avoir plusieurs millions de lignes.

// $datedebut est le debut de la plage qui m'interesse
// $datefin est la fin.
// on regarde la dispo de stock pour chaque heure pleine donc pour mon WHILE j'ajoute 3600 à chaque tour sur $datedebut

Code : Tout sélectionner

$qtmax = 0; while($datedebut <= $datefin) { $req_sortant = mysql_query(" SELECT SUM(lignes.lignes_quantite) as qtsortant FROM DOCUMENTS_LIGNES AS lignes JOIN DOCUMENTS AS documents on documents.documents_id = lignes.documents_id WHERE ".$datedebut." BETWEEN documents.datedebut AND documents.datefin AND lignes.produits_id = '".$produits_id."' AND lignes.lignes_quantite != 0 group by lignes.produits_id") or die (bug(343,mysql_error())); $sortant = mysql_fetch_array($req_sortant); if($qt[$datedebut] > $qtmax) { $qtmax = $qt[$datedebut]; } $datedebut = $datedebut + 3600; } echo $qtmax;


si quelqu'un arrive à m'aider ce serait dingue!

merci

woowoo
Invité n'ayant pas de compte PHPfrance

13 déc. 2016, 11:17

Salut, j'ai pas forcement tout compris mais deja ton +3600 je ne suis pas forcement fan.
Si tu veux un nombre donnée pour une heure donnée, pourquoi ne pas faire un SELECT *, Hour(`tonchampdate`) ......... GROUP BY Hour(`tonchampdate`)

la ça te donnerai un dispatche de tes data par heures et ça évite un nombre important de requêtes, car au final ta boucle envoie une nouvelle requête pour chaque heures