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 requêtes [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2009
    Messages : 186
    Par défaut Optimisation de requêtes
    Bonjour !

    J'ai un énorme soucis avec un code. Je souhaite l'optimiser pour qu'il prenne moins de temps, mais je n'y connais pas grand chose en SQL
    Regardez cette usine à gaz :

    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
     
    // Compte le nombre de personnes qui possèdent plus d'un pc.
    			$result6 = mysql_query("SELECT NOM,PRENOM FROM ".$T_factur." GROUP BY NOM, PRENOM");
    			while($row6 = mysql_fetch_object($result6)) 
    			{
    				$total++;
    				$nom=$row6->NOM;
    				$prenom=$row6->PRENOM;
    				$result7 = mysql_query("SELECT COUNT(NOM) as TOTAL FROM ".$T_factur." WHERE NOM LIKE '".$nom."' AND PRENOM LIKE '".$prenom."' AND CODE_PRODUIT_CATALOGUE LIKE 'W1006' OR NOM LIKE '".$nom."' AND PRENOM LIKE '".$prenom."' AND CODE_PRODUIT_CATALOGUE LIKE 'W1001' OR NOM LIKE '".$nom."' AND PRENOM LIKE '".$prenom."' AND CODE_PRODUIT_CATALOGUE LIKE 'W1017'  OR NOM LIKE '".$nom."' AND PRENOM LIKE '".$prenom."' AND CODE_PRODUIT_CATALOGUE LIKE 'W1019'");
    				while($row7 = mysql_fetch_object($result7)) 
    				{
    					$nombre=$row7->TOTAL;
    				}
    				if($nombre>1)
    				{
    					$nb_employes++;
    				}
    			}
    En gros, cette petite suite de lignes de code doit me sortir le nombre d'employés pour lesquel, dans une facturation, on retrouve les références W1017, W1001, W1019, W1006 plus d'une fois ( Exemple, deux fois W1017 ou une fois W1001 et une fois W1019 ... )

    La structure de la base est pas très claire mais malheureusement je ne peux pas la modifier, je reprends du code

    Quelqu'un a une idée concernant cette optimisation ? J'imagine qu'il est possible de sortir ce résultat en une requête mais je ne vois pas comment.

    Bien cordialement.

  2. #2
    Membre très actif
    Inscrit en
    Mars 2009
    Messages
    191
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2009
    Messages : 191
    Par défaut optimisation
    salut, je pense que ton code n'est commenté suffisament,
    apparement il s'agit d'une seule table sur laquelle tu fais tes operations(permet moi de te tutoiyer),
    alors si c'est le cas, pourquoi ne pas faire une requete de la sorte:
    "select count(*) from table where nom like $a and prenom like $b and code_produit=$c"?
    et si j'ai mal compris, faut mieux expliquer la structure de la table, comment ton code

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 71
    Par défaut
    Salut
    Pourquoi tu rajoutes pas le groupe by dans ta deuxième requête?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $result7 = mysql_query("SELECT COUNT(NOM) as TOTAL FROM ".$T_factur." WHERE NOM LIKE '".$nom."' AND PRENOM LIKE '".$prenom."' AND CODE_PRODUIT_CATALOGUE LIKE 'W1006' OR NOM LIKE '".$nom."' AND PRENOM LIKE '".$prenom."' AND CODE_PRODUIT_CATALOGUE LIKE 'W1001' OR NOM LIKE '".$nom."' AND PRENOM LIKE '".$prenom."' AND CODE_PRODUIT_CATALOGUE LIKE 'W1017'  OR NOM LIKE '".$nom."' AND PRENOM LIKE '".$prenom."' AND CODE_PRODUIT_CATALOGUE LIKE 'W1019 GROUP BY NOM,PRENOM'");

  4. #4
    Membre éclairé Avatar de TrEiZe85
    Inscrit en
    Février 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Février 2007
    Messages : 82
    Par défaut
    Si j'ai tout compris, pour avoir le nombre d'employés pour lesquel, dans une facturation, on retrouve les références W1017, W1001, W1019, W1006 plus d'une fois....

    La requête doit grosso modo ressembler à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
     
    SELECT COUNT(DISTINCT(NOM)) FROM(
     
    SELECT CODE_PRODUIT,NOM,COUNT(CODE_PRODUIT) AS NB_PRODUIT 
    FROM `test` 
    WHERE CODE_PRODUIT LIKE 'W1019' OR CODE_PRODUIT LIKE 'W1011' 
    GROUP BY NOM,CODE_PRODUIT
     
    ) AS RESULT WHERE NB_PRODUIT > 1
    Dans la clause WHERE ajoute les produit dont tu a besoin... Pour optimiser tout ca un petit index sur CODE_PRODUIT serait pas mal selon la volumetrie de ta table !

    J'avoue que la requête imbriquée ne fait pas trop propre mais bon...

  5. #5
    Membre expérimenté Avatar de BlackSmith
    Inscrit en
    Mars 2008
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2008
    Messages : 181
    Par défaut
    Bonjour,

    tu peux déjà commencer par mettre des parenthèse dans ta clause where pour bien séparer les AND et les OR, ensuite tu peux mettre = à la place de like pour le code produit si tu n'utilise pas de % dans la valeur

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2009
    Messages : 186
    Par défaut
    Merci pour toutes ces informations ( désolé du temps de réponse mais j'ai eu un week end un peu long :p )

    Je vais tester cette requête et voir si le temps d'execution s'en voit amélioré ou non !!

    Bien cordialement.

    EDIT : En fait, ce nombre d'employés m'intéresse grandement mais pas seulement.

    Je désire aussi afficher le nom et prénom d'un employé dont le nombre de références est supérieur à 1

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    NOM | PRENOM | NOMBRE DE REF.
    TATIN |TARTE | 3
    ROBERT | CLAUDE | 2
    GEORGES | JACQUES | 5
    etc ...
    Désolé, je ne suis pas assez clair dans mes explications

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2009
    Messages : 186
    Par défaut
    Bien sûr que tu peux me tutoyer, je suis un petit jeune :p

    Desolé, je vais mieux m'expliquer.

    J'ai une table qui contient des facturations ( $T_factur ici )
    Elle possède une liste de champs, dont les suivants :

    NOM
    PRENOM
    CODE_PRODUIT_CATALOGUE

    Les enregistrements sont du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    NOM | PRENOM | CODE_PRODUIT_CATALOGUE
    KEKE | Robert | W1011
    KEKE | Robert | W1019
    TARTE | Tatin | W1011
    TARTE | Tatin | XA343
    JACQUES | Jean | W1017
    TROP | Thierry | W1011
    TROP | Thierry | W1019
    Le code, comme je l'ai écrit, me sors le nombre d'employés qui possèdent plusieurs enregistrements avec les codes W1019, W1011 ou W1017.
    Dans l'exemple j'aurais donc 2 ( KEKE Robert et TROP Thierry )

    Voici le code un peu plus commenté.

    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
     
    			// Compte le nombre de personnes qui possèdent plus d'un pc.
    			// On selectionne les noms en eliminant les doublons de la selection
    			$result6 = mysql_query("SELECT NOM,PRENOM FROM ".$T_factur." GROUP BY NOM, PRENOM");
    			while($row6 = mysql_fetch_object($result6)) 
    			{
    				$nom=$row6->NOM;
    				$prenom=$row6->PRENOM;
    				// Pour chaque nom, on compte le nombre d'enregistrements ou le code_produit_catalogue est d'un ordinateur.
    				$result7 = mysql_query("SELECT COUNT(NOM) as TOTAL FROM ".$T_factur." WHERE NOM LIKE '".$nom."' AND PRENOM LIKE '".$prenom."' AND CODE_PRODUIT_CATALOGUE LIKE 'W1006' OR NOM LIKE '".$nom."' AND PRENOM LIKE '".$prenom."' AND CODE_PRODUIT_CATALOGUE LIKE 'W1001' OR NOM LIKE '".$nom."' AND PRENOM LIKE '".$prenom."' AND CODE_PRODUIT_CATALOGUE LIKE 'W1017'  OR NOM LIKE '".$nom."' AND PRENOM LIKE '".$prenom."' AND CODE_PRODUIT_CATALOGUE LIKE 'W1019'");
    				while($row7 = mysql_fetch_object($result7)) 
    				{
    					$nombre=$row7->TOTAL;
    				}
    				if($nombre>1)
    				{
    					// Si le nombre de matériel est supérieur à 1, on incremente.
    					$nb_employes++;
    				}
    			}
    Est-ce plus compréhensible ?

    @dinde : Si je fait le groupe by dans cette requete, etant donné qu'il y a plusieurs facturation au même nom, j'obtiendrais une seule ligne par personne et je ne pourrais pas compter le nombre de facturations, non ? Je sais pas vraiment en fait ^^'

    Bien cordialement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Access] Optimisation performance requête - Index
    Par fdraven dans le forum Access
    Réponses: 11
    Dernier message: 12/08/2005, 14h30
  2. Optimisation de requête avec Tkprof
    Par stingrayjo dans le forum Oracle
    Réponses: 3
    Dernier message: 04/07/2005, 09h50
  3. Optimiser une requête SQL d'un moteur de recherche
    Par kibodio dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/03/2005, 20h55
  4. optimisation des requêtes
    Par yech dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 21/09/2004, 19h03
  5. Optimisation de requête
    Par olivierN dans le forum SQL
    Réponses: 10
    Dernier message: 16/12/2003, 10h09

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