IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Optimisation de requete suite a probleme de depassement de ressources chez OVH [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut Optimisation de requete suite a probleme de depassement de ressources chez OVH
    Bonjour à tous,

    J'ai développé depuis des années un petit CRM qui gère des contacts, au fur et à mesure de connaissances glanées et comprises sur divers forums.

    Evidemment PHP 5.6 est obsolète et je dois comprendre PHP 7.2 car OVH me dit que j'ai des dépassement de ressources avec les requêtes PHP.

    Or j'ai le sentiment que le pont est infranchissable tant je ne comprends pas le système de classe opposé aux requêtes écrites directement en php 5.6 et mysql 5.6.

    D'abord comme je code encore en mysql, on me dit de passer en PDO , ce qui est deja une epreuve quand on est pas un developpeur de base, ensuite il me faut passer aux classes de php 7.2.

    Je voudrai comprendre avec juste un exemple de code, des fois que je puisse comprendre par assimilation :

    Aujourd'hui quand je veux lire plusieurs tables jointes a partir d'un ID commun, j'ecris ce code mais le probleme est que meme si je selectionne les 30 nom de champs avant mon FROM, la requete est hyper lente :

    L'ensemble des 3 tables represente plus de 600 champs et plus de 30000 lignes insérées.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
     
    	$phrase_0 ="FROM `".$sufftable."table_1` D, `".$sufftable."table_2` G, `".$sufftable."table_3` U where ;
     
            $phrase_1 = "SELECT D.champA , D.champB , G.champD, U.champE $phrase_0";  // en réalité il y a 30 champs sur 600 qui sont indiqués car je n'ai besoin que de ces 30 la.
     
    	$phrase_2 = "SELECT SUM(D.champA ) as com $phrase_0";
            $phrase_3 = "SELECT SUM(D.champB ) as com $phrase_0";
     
    	$phrase_1_1='';
    	$phrase_2_2='';
    	$phrase_3_3='';
     
     
    	if ($searchstatut=="nouveau")
    	{
    		if ($c_annee<>""){$date_liste =" and (D.etude_A='$c_annee' or D.suivi_A='$c_annee')";}  else {$date_liste =" and (D.date>'$time_c_jour' or D.datemodif>'$time_c_jour')";}
    		$phrase_1_1 .= " and D.suivi='' and D.etude=''";
    		$phrase_2_2 .= $phrase_1_1;
    		$phrase_3_3 .= $phrase_1_1;
    	}
     
    	$phrase0 = " D.idCT=G.idCT and G.idGEST=U.idUT";
     
            $toto = $phrase_1.$phrase0.$date_liste.$secureclient;	
    	$phrase_1 = $phrase_1.$phrase0.$phrase_1_1.$date_liste;	
     
    	$resultat = mysql_query("$phrase_1 group by D.idCLIENT order by D.idCLIENT desc");
     
    	$nbresultat =mysql_num_rows($resultat);
    	$phrase_2 = $phrase_2.$phrase0.$phrase_2_2.$date_liste.$secureclient;
    	$phrase_3 = $phrase_3.$phrase0.$phrase_3_3.$date_liste.$secureclient;
     
    	$res = mysql_query("$phrase_1 group by D.idCLIENT order by D.idCLIENT desc");
    	$res_2 = mysql_query("$phrase_2 order by D.idCLIENT desc");
    	$res_3 = mysql_query("$phrase_3 order by D.idCLIENT desc");
     
     
    	$totchampA = mysql_result($res_2, 0, 'com'); $totchampA = number_format($totchampA , 2, ',', ' '); 
    	$totchampB = mysql_result($res_3, 0, 'com'); $totchampB = number_format($totchampB , 2, ',', ' '); 
     
    	$nbmaxres =mysql_num_rows($res);
     
     
    	/// le header de mon tableau
     
     
    	while($cl = mysql_fetch_array($res, MYSQL_ASSOC))
    	{
    		$idCT =$cl['idCT'];
    		$idGEST=$cl['idGEST'];                /// .....
                    ///  echo 'mes resultats';
     
                   $res_journal = mysql_query("SELECT * FROM `".$sufftable."journal` where idCT='$idCT  ' and ip='$ip'");
    	       $nb_journal =mysql_num_rows($res_journal );
                   if ($nb_journal =="0"){$modif=mysql_query("INSERT INTO `".$sufftable."journal` (`idCT`,`idGEST`,`date`,`ip`) VALUES ('$idcl','$idGEST','$auj','$ip')");}
                   else {$modif = mysql_query("UPDATE `".$sufftable."journal` SET `date` = '$auj' WHERE `idCT` = '$idCT' and `ip`='$ip' ");
            }
    Merci pour toute votre aide et explcations.

    Trés bon dimanche
    Guillaume

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	$phrase_0 ="FROM `".$sufftable."table_1` D, `".$sufftable."table_2` G, `".$sufftable."table_3` U where ;
    1- Il manque un " avant le ; (mais je suppose que c'est juste un oubli)

    2- PLUS GRAVE : mauvaise syntaxe !
    Il faut faire des JOINTURES.

    Ex. :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $phrase_0 = " FROM table_1 D
       INNER JOIN table_2 G
          ON D..... = G.....
       INNER JOIN table_3 U
          ON D..... = U.....
      WHERE ";
    A toi de savoir sur quelles colonnes faire les jointures.
    Si je suppose aussi que c'est là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    D.idCT=G.idCT and G.idGEST=U.idUT
    Alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $phrase_0 = " FROM table_1 D
       INNER JOIN table_2 G
          ON D.idCT=G.idCT
       INNER JOIN table_3 U
          ON G.idGEST=U.idUT
      WHERE ";
    3- AFFICHE ta/tes requêtes : pour vérifier ce qu'elles contiennent.

    Et tes $phrase_1, $phrase_2, $phrase_1_1,...... : c'est ILLISIBLES !!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            $toto = $phrase_1.$phrase0.$date_liste.$secureclient;	
    	$phrase_1 = $phrase_1.$phrase0.$phrase_1_1.$date_liste;
    Et bonjour la galère pour la maintenance !

    4- Enfin, passe à PDO rapidement.
    Ce n'est pas la 1ère fois qu'on te le dit, et ça ne sert à rien de repousser l'échéance.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut
    Bonjour jreaux62 et merci pour ton intervention,

    Concernant PDO c'est justement ma question, je ne comprends pas si PDO est ce que c'est justement du PHP 7 ou aucun rapport.

    Et comment transcrire mon code en PDO, c'était ma question en fait.

  4. #4
    Invité
    Invité(e)
    Par défaut
    • mysql_ a été SUPPRIMÉ de PHP7.
    • PDO existe DEPUIS PHP 5.1 !


    Il faut utiliser PDO *:


    Là, il va falloir mettre TON code de coté, pour faire des EXERCICES (simples), afin de BIEN COMPRENDRE LA SYNTAXE PDO.
    Notamment, la notion de requête préparée.
    Ensuite, ce sera du gâteau.


    * J'aurais pu te parler de mysqli_, mais ce ne serait pas te rendre service (c'est très fastidieux, surtout pour les requêtes préparées), et PDO est le standard à connaitre.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut
    Je pense que tu as raison il faut que je mette de coté mon taf actuel pour passer a PDO définitivement, je vais aller sur des sites comme codeur.fr ou autre (peut etre y a t-il un forum ici) pour demander des devis ç des freelance pour mes devs préssés en php 7.2(PDO), comme ça au lieu de comprendre ce que les autres font et tenter de les démultiplier, je vais profiter du temps libre dégagé pour réapprendre à la base.

    Merci

  6. #6
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Moi je crois que tu devrais commencer par te poser des questions sur ton SQL...
    PDO, on verra après, c'est de la rigolade.

    Fais un echo SQL de ton "bazar" si je puis me permettre.
    Et fais-le tourner dans le PHPmyAdmin de OVH.
    Est-ce que ça prend un temps fou fou fou ?
    Si c'est le cas, ajoute un limit 10; qu'on puisse voir au moins ce que tu fais tourner comme requête.
    tu parles de 600 champs et 30 000 tuples, OK... c'est beaucoup. Ce qui m'étonne, ce ne sont pas tant les 30 000 tuples que les... 600 champs. Etonnant, ça, une table de 600 champs.
    Je crains fort qu'il y ait une lacune de modélisation.

    Peux-tu nous montrer ce "echo $sql" ?

    Thanks...
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  7. #7
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Apprends aussi à mettre des bons indexes sur les champs qui font l'objet de recherches. S'il y a une chose à connaître absolument en matière de performances de base de données, c'est l'utilisation d'indexes qui peuvent diviser le temps de recherche par un facteur de 100 voire bien plus.

  8. #8
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Toutafé, Tsifely...
    Sans parler des clés étrangères.
    Alors si en plus, Olivier fait des sous-requêtes de sous-requêtes de sous-requêtes avec des tables de 600 champs... sans indexes.
    Tout le problème est là.
    Donc pour conclure Olivier, il y a fort à papier que si tu nous donnes le schéma de ta base de données, ou au moins la structure de tes tables (argggggggggh, 600 colonnes je n'y crois pas) et les relations entre elles, on pourra vraiment t'aider.
    Il y a des chances que tu n'aies pas modélisé façon Merise et que tu aies fait des tables intuitives pour les humains disons, mais un non sens pour la modélisation.
    Ensuite, on parlera des indexes, des clés étrangères, des bonnes requêtes (dans cet ordre).

    Et enfin, on passera à PDO pour que ton code ne te lâche pas avec PHP7...
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut
    Bonjour et merci également a vous 2 pour votre aide.

    Je vais mettre les deux fichiers en pièces jointes (code final complet et tables SQL), mais je vais me faire lyncher vu l'amateurisme horrible de mon code.

    Merci milles fois et toutes mes excuses par avance.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Dendrite Voir le message
    ...tu devrais commencer par te poser des questions sur ton SQL...
    PDO, on verra après, ....
    ...
    D'accord, et pas d'accord.

    Il faut bien comprendre que les deux sont indépendants :
    1- le SQL pour l'optimisation des performances des requêtes : structure des tables, clés primaires/étrangères (PRIMARY/FOREIGN KEYS), indexes,...
    2- PDO sert, dans le PHP, à communiquer avec la bdd : syntaxe PDO, requêtes préparées,...

    • Donc, optimiser le SQL, oui.
    • Négliger PDO, non. *

    * J'entends par là qu'il serait contre-productif d'écrire le code avec mysql_.
    PDO a une syntaxe différente, surtout concernant les requêtes préparées, et d'autre part, on a des astuces de codages, notamment pour les clauses WHERE/AND (avec un array, ...) qu'il est inutile d'expliquer ici.
    Dernière modification par Invité ; 16/09/2019 à 10h17.

  11. #11
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Ok Jreaux.

    @Olivier, ben, non, tu ne te feras pas lyncher. Faut bien commencer un jour. Ceux qui sont énervants, c'est ceux qui refusent toute évolution, sous prétexte que "ça marchouille".
    Là, il faut pas que tu aies peur d'une grosse refonte...
    Ca n'empêchera pas ta reprise de données rassure-toi...
    Tu peux me dire deux mots sur le contexte général ? on traite quoi ? des demandes de crédits immobiliers ?
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  12. #12
    Invité
    Invité(e)
    Par défaut
    @Dendrite,

    1- Je te laisse gérer le SQL : c'est ton domaine.

    2- Quant au PDO, ben... aussi, puisque tu as écrit "PDO une soupe et au lit !"

    Citation Envoyé par jreaux62 Voir le message
    3- Concernant les astuces d'écriture (clause WHERE/AND,...), on verra plus tard, quand le SQL sera structuré.

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut
    Re Bonjour Dentrite,

    C'est bien ça

    En fait une association d'aide aux personnes en difficultés suite a trop de crédits et des crédits immobiliers en prenant en compte tous les revenus et charges, et divers frais qu'ils avaient contractés pour contracter les crédits.

    La table dem pour les informations dossiers
    la table gestion pour indiquer qui sont les personnes qui gerent une demande
    la table utilisateur pour se connecter et voir les demandes affectées en tant que gestionnaires d'une demande.
    La table pro qui permet de faire des proposition

    et donc une liaison entre ces tables pour afficher la liste avec un résumé des informations.

    Merci encore de ton aide.

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut
    Merci jreaux62 pour ton apport, j'ai commandé sur le net PHP 7.2 pour les nuls ...lol

    tu as raison il faut que j'apprenne avant tout.

  15. #15
    Invité
    Invité(e)
    Par défaut
    Houlà... J'ai ouvert les fichiers...
    Si tu veux de l'aide, il va falloir être moins AVARE en explications !

    1- Explique clairement les relations entre les tables (par un shéma, un dessin, ou en l'écrivant)

    2- Mets des commentaires dans ton code PHP ! Il n'y en a pas du tout !
    Comment vas-tu faire quand tu devras, dans 1 an, 2 ans, faire des modifications, maintenance,... ??
    Ou pire : transmettre ton code à un successeur...

    De plus, il n'y a pas moins de 11 requêtes !
    Explique ce que fait chacune d'elles.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            $res = mysql_query("$phrase_1 group by D.idCLIENT order by D.idCLIENT desc");
            $res_2 = mysql_query("$phrase_2 order by D.idCLIENT desc");
            $res_3 = mysql_query("$phrase_3 order by D.idCLIENT desc");
            $res_4 = mysql_query("$phrase_4 and D.idCLIENT=I.idCLIENT order by D.idCLIENT desc");
            $res_5 = mysql_query("$phrase_5 and D.idCLIENT=I.idCLIENT order by D.idCLIENT desc");
            $res_6 = mysql_query("$phrase_6 and D.idCLIENT=I.idCLIENT order by D.idCLIENT desc");
            $res_7 = mysql_query("$phrase_7 and D.idCLIENT=I.idCLIENT order by D.idCLIENT desc");
    Tu fais ici 7 requêtes à la suite !
    Tu m'étonnes que tu bouffes la ressource...


    3- Pour ne parler que du code PHP :
    • on peut remplacer avantageusement les if ($searchstatut=="...") elseif(...) par une syntaxe switch() case.
    • remplace $phrase_ par $sql_ : ça gagnera aussi en clarté.
    Dernière modification par Invité ; 16/09/2019 à 10h41.

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut
    En fait comme j'ai tenté de l'expliquer un peu plus haut, ce script permet d'afficher une liste de dossier.

    Parmi les infos a afficher, j'ai besoin non seulement d'informations :
    1 - dans la table dem qui correspondent aux information du demandeur
    2 - dans la table pro qui affiche les proposition et qui est reliée avec la premiere par un champ commun de la table dem : idCLIENT (idCLIENT est un index de la table dem)
    3 - dans la table gestion qui affiche les gestionnaires d'une demande, la aussi on retrouve idCLIENT (lien avec la table dem) et idGEST donc le champ equivalent est idUT dans la table utilisateurs
    4 - dans la table utilisateurs ou on trouve les informations de l'utilisateur du logiciel qui peut devenir un gestionnaire d'une demande.

    donc D.idCLIENT = P.idCLIENT and D.idCLIENT=G.idCLIENT and G.idGEST=U.iDUT

    Concernant les 7 requetes c'est parce qu'aprés j'ai besoin de faire des totaux du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $totMT_1 = mysql_result($res_2, 0, 'com');$totMT_1= number_format($totMT_1, 2, ',', ' '); 
    $totfrmt = mysql_result($res_3, 0, 'com') + mysql_result($res_4, 0, 'com');$totfrmt= number_format($totfrmt, 2, ',', ' '); 
    $totcomretro = mysql_result($res_5, 0, 'com');$totcomretro= number_format($totcomretro, 2, ',', ' '); 
    $totcomnette = mysql_result($res_6, 0, 'com');$totcomnette= number_format($totcomnette, 2, ',', ' '); 
    $totcombq = mysql_result($res_7, 0, 'com');$totcombq= number_format($totcombq, 2, ',', ' ');
    dont les requettes sont issues de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $sql_1 = "SELECT D.urldossier,D.fact_retrocommission,D.fact_commission_banque,D.fact_commission_nette,I.projet_nat,I.projet_log, D.idAPP, D.idNOT, D.idRECOCL, D.cp,D.email,D.etude, D.suivi, D.etude_A, D.suivi_A, D.traitement, D.idCLIENT, D.internet_date_A, D.internet, D.date, D.datemodif, D.dateA, D.supp, D.ope_dossier, D.log, D.endet_av, D.fact_montant_final, G.idGEST, U.idUT, D.frmd_mt, rav_av, pro_select_1, pro_select_2, pro_select_3, pro_endetap_1, pro_restavap_1, pro_nombanque_1, pro_endetap_2, pro_restavap_2, pro_nombanque_2, pro_endetap_3, pro_restavap_3, pro_nombanque_3, D.nom_e, D.prenom_e, D.nom_c, D.prenom_c, D.tel, D.port, D.note_etoile, I.txz_dept, I.immo_frais_courtage FROM `".$sufftable."dem` D, `".$sufftable."dem_gestion` G, `".$suff_table."utilisateur` U, `".$sufftable."dem_pro` P, `".$sufftable."dem_immo` I where";
     
    $sql_0 ="FROM `".$sufftable."dem` D, `".$sufftable."dem_gestion` G, `".$suff_table."utilisateur` U, `".$sufftable."dem_pro` P, `".$sufftable."dem_immo` I where";
     
    $sql_2 = "SELECT SUM(D.fact_montant_final) as com $sql_0";
    $sql_3 = "SELECT SUM(D.frmd_mt) as com $sql_0";
    $sql_4 = "SELECT SUM(D.immo_frais_courtage) as com $sql_0";
    $sql_7 = "SELECT SUM(D.fact_commission_banque) as com $sql_0";
    $sql_5 = "SELECT SUM(D.fact_retrocommission) as com $sql_0";
    $sql_6 = "SELECT SUM(D.fact_commission_nette) as com $sql_0"
    ;


    J'ai changé $phrase en $sql :-D

    Merci pour toute l'aide de comprehension

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut
    Mauvaise réponse de ma part

  18. #18
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par kaolivier Voir le message
    En fait comme j'ai tenté de l'expliquer un peu plus haut, ce script permet d'afficher une liste de dossier.
    Non. Ça, c'est juste un résumé.
    Ça n'explique rien du contenu des requêtes SQL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sql_2 = "SELECT SUM(D.fact_montant_final) as com $sql_0";
    $sql_3 = "SELECT SUM(D.frmd_mt) as com $sql_0";
    ...
    TOUTES les sommes peuvent (à priori) être regroupées dans la MEME requête (voire dans la 1ère), pour peu que tu mettes des ALIAS (AS ...) différents :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $sql_1 = "SELECT 
       ........., (les 600 colonnes !)
       SUM(D.fact_montant_final) AS SUM_fact_montant_final,
       SUM(D.frmd_mt) AS SUM_frmd_mt,
       ...
    donc D.idCLIENT = P.idCLIENT and D.idCLIENT=G.idCLIENT and G.idGEST=U.iDUT
    Là, c'est ce que je t'ai expliqué plus haut sur les JOINTURES SQL.

    PEUX-TU NOUS MONTRER le CONTENU de chaque REQUETE ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo '$sql_1 : '.$sql_1.'<br />';
    echo '$sql_2 : '.$sql_2.'<br />';
    ....

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut
    Voila les resultats des 7 par contre je n'ai pas encore appliqué le principe des jointures que tu m'avais expliquer.


    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    SELECT D.urldossier,D.fact_retrocommission,D.fact_commission_banque,D.fact_commission_nette,I.projet_nat,I.projet_log, D.idAPP, D.idNOT, D.idRECOCL, D.cp,D.email,D.etude, D.suivi, D.etude_A, D.suivi_A, D.traitement, D.idCLIENT, D.internet_date_A, D.internet, D.date, D.datemodif, D.dateA, D.supp, D.ope_dossier, D.log, D.endet_av, D.fact_montant_final, G.idGEST, U.idUT, D.frmd_mt, rav_av, pro_select_1, pro_select_2, pro_select_3, pro_endetap_1, pro_restavap_1, pro_nombanque_1, pro_endetap_2, pro_restavap_2, pro_nombanque_2, pro_endetap_3, pro_restavap_3, pro_nombanque_3, D.nom_e, D.prenom_e, D.nom_c, D.prenom_c, D.tel, D.port, D.note_etoile, I.txz_dept, I.immo_frais_courtage FROM `extratest_dem` D, `extratest_dem_gestion` G, `extratest_utilisateur` U, `extratest_dem_pro` P, `extratest_dem_immo` I where P.idCLIENT=D.idCLIENT and D.idCLIENT=G.idCLIENT and G.idGEST=U.idUT and I.idCLIENT=D.idCLIENT and (D.etude<>'d_e_refus' and D.etude<>'d_c_abandon' and D.etude<>'d_b_abandon' and D.suivi<>'d_b_refus' and D.suivi<>'d_b_termine') and D.nom_e LIKE '%' and (D.date>'1554069600' or D.datemodif>'1554069600') and U.idUT='2' and D.supp='0' group by D.idCLIENT order by D.idCLIENT desc
     
     
    SELECT SUM(D.fact_montant_final) as com FROM `extratest_dem` D, `extratest_dem_gestion` G, `extratest_utilisateur` U, `extratest_dem_pro` P, `extratest_dem_immo` I where P.idCLIENT=D.idCLIENT and D.idCLIENT=G.idCLIENT and G.idGEST=U.idUT and I.idCLIENT=D.idCLIENT and (D.etude<>'d_e_refus' and D.etude<>'d_c_abandon' and D.etude<>'d_b_abandon' and D.suivi<>'d_b_refus' and D.suivi<>'d_b_termine') and D.nom_e LIKE '%' and (D.date>'1554069600' or D.datemodif>'1554069600') and U.idUT='2' and D.supp='0' group by D.idCLIENT order by D.idCLIENT desc
     
     
    SELECT SUM(D.frmd_mt) as com FROM `extratest_dem` D, `extratest_dem_gestion` G, `extratest_utilisateur` U, `extratest_dem_pro` P, `extratest_dem_immo` I where P.idCLIENT=D.idCLIENT and D.idCLIENT=G.idCLIENT and G.idGEST=U.idUT and I.idCLIENT=D.idCLIENT and (D.etude<>'d_e_refus' and D.etude<>'d_c_abandon' and D.etude<>'d_b_abandon' and D.suivi<>'d_b_refus' and D.suivi<>'d_b_termine') and D.nom_e LIKE '%' and (D.date>'1554069600' or D.datemodif>'1554069600') and U.idUT='2' and D.supp='0' group by D.idCLIENT order by D.idCLIENT desc
     
     
    SELECT SUM(D.immo_frais_courtage) as com FROM `extratest_dem` D, `extratest_dem_gestion` G, `extratest_utilisateur` U, `extratest_dem_pro` P, `extratest_dem_immo` I where P.idCLIENT=D.idCLIENT and D.idCLIENT=G.idCLIENT and G.idGEST=U.idUT and I.idCLIENT=D.idCLIENT and (D.etude<>'d_e_refus' and D.etude<>'d_c_abandon' and D.etude<>'d_b_abandon' and D.suivi<>'d_b_refus' and D.suivi<>'d_b_termine') and D.nom_e LIKE '%' and (D.date>'1554069600' or D.datemodif>'1554069600') and U.idUT='2' and D.supp='0' group by D.idCLIENT order by D.idCLIENT desc
     
     
    SELECT SUM(D.fact_retrocommission) as com FROM `extratest_dem` D, `extratest_dem_gestion` G, `extratest_utilisateur` U, `extratest_dem_pro` P, `extratest_dem_immo` I where P.idCLIENT=D.idCLIENT and D.idCLIENT=G.idCLIENT and G.idGEST=U.idUT and I.idCLIENT=D.idCLIENT and (D.etude<>'d_e_refus' and D.etude<>'d_c_abandon' and D.etude<>'d_b_abandon' and D.suivi<>'d_b_refus' and D.suivi<>'d_b_termine') and D.nom_e LIKE '%' and (D.date>'1554069600' or D.datemodif>'1554069600') and U.idUT='2' and D.supp='0' group by D.idCLIENT order by D.idCLIENT desc
     
     
    SELECT SUM(D.fact_commission_nette) as com FROM `extratest_dem` D, `extratest_dem_gestion` G, `extratest_utilisateur` U, `extratest_dem_pro` P, `extratest_dem_immo` I where P.idCLIENT=D.idCLIENT and D.idCLIENT=G.idCLIENT and G.idGEST=U.idUT and I.idCLIENT=D.idCLIENT and (D.etude<>'d_e_refus' and D.etude<>'d_c_abandon' and D.etude<>'d_b_abandon' and D.suivi<>'d_b_refus' and D.suivi<>'d_b_termine') and D.nom_e LIKE '%' and (D.date>'1554069600' or D.datemodif>'1554069600') and U.idUT='2' and D.supp='0' group by D.idCLIENT order by D.idCLIENT desc
     
     
    SELECT SUM(D.fact_commission_banque) as com FROM `extratest_dem` D, `extratest_dem_gestion` G, `extratest_utilisateur` U, `extratest_dem_pro` P, `extratest_dem_immo` I where P.idCLIENT=D.idCLIENT and D.idCLIENT=G.idCLIENT and G.idGEST=U.idUT and I.idCLIENT=D.idCLIENT and (D.etude<>'d_e_refus' and D.etude<>'d_c_abandon' and D.etude<>'d_b_abandon' and D.suivi<>'d_b_refus' and D.suivi<>'d_b_termine') and D.nom_e LIKE '%' and (D.date>'1554069600' or D.datemodif>'1554069600') and U.idUT='2' and D.supp='0' group by D.idCLIENT order by D.idCLIENT desc


    ------

    OK pour tous les SUM dans la meme requete mais il faut bien une requete executée par t attendu meme si le $sql est la meme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $sql_2 = "SELECT SUM(D.fact_montant_final) as com_A, SUM(D.frmd_mt) as com_B, SUM(D.immo_frais_courtage) as com_C, SUM(D.fact_commission_banque) as com_D, SUM(D.fact_retrocommission) as com_E, SUM(D.fact_commission_nette) as com_F FROM `".$sufftable."dem` D, `".$sufftable."dem_gestion` G, `".$suff_table."utilisateur` U, `".$sufftable."dem_pro` P, `".$sufftable."dem_immo` I where";
     
    $totMT_1 = mysql_result($sql, 0, 'com_A');$totMT_1= number_format($sql, 2, ',', ' '); 
    $totfrmt = mysql_result($sql, 0, 'com_B') + mysql_result($res_4, 0, 'com_C');$totfrmt= number_format($totfrmt, 2, ',', ' '); 
    $totcombq = mysql_result($sql, 0, 'com_D');$totcombq= number_format($totcombq, 2, ',', ' '); 
    $totcomretro = mysql_result($sql, 0, 'com_E');$totcomretro= number_format($totcomretro, 2, ',', ' '); 
    $totcomnette = mysql_result($sql, 0, 'com_F'); $totcomnette= number_format($totcomnette, 2, ',', ' ');

  20. #20
    Invité
    Invité(e)
    Par défaut
    Tu vas dès à présent prendre une BONNE HABITUDE : INDENTE les requêtes !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $sql_2 = "SELECT 
       SUM(D.fact_montant_final) as com_A, 
       SUM(D.frmd_mt) as com_B, 
       SUM(D.immo_frais_courtage) as com_C, 
       SUM(D.fact_commission_banque) as com_D, 
       SUM(D.fact_retrocommission) as com_E, 
       SUM(D.fact_commission_nette) as com_F 
       FROM `".$sufftable."dem` D, `".$sufftable."dem_gestion` G, `".$suff_table."utilisateur` U, `".$sufftable."dem_pro` P, `".$sufftable."dem_immo` I 
       WHERE";
    Quant à :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
       FROM `".$sufftable."dem` D, `".$sufftable."dem_gestion` G, `".$suff_table."utilisateur` U, `".$sufftable."dem_pro` P, `".$sufftable."dem_immo` I
    Je t'EXPLIQUE pour la TROISIEME FOIS qu'il faut faire des JOINTURES !!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 4 1234 DernièreDernière

Discussions similaires

  1. [sgbd]Optimisation des requetes Oracle/Perl
    Par linou dans le forum SGBD
    Réponses: 7
    Dernier message: 30/06/2005, 18h09
  2. Optimiser une Requetes SQL sous ASP
    Par NeHuS dans le forum ASP
    Réponses: 8
    Dernier message: 18/04/2005, 16h26
  3. [C#] Requête MS Access (Problème avec Date)
    Par Erakis dans le forum ASP.NET
    Réponses: 4
    Dernier message: 16/02/2005, 22h54
  4. Optimisation de requete
    Par cyril dans le forum SQL
    Réponses: 3
    Dernier message: 09/10/2003, 08h57
  5. Optimisation des requetes
    Par bifidus dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 06/10/2003, 11h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo