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 affichage d'un query [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Points : 47
    Points
    47
    Par défaut Optimisation affichage d'un query
    Bonjour à tous,

    Je voudrais afficher pour chaque abonné les options qu'il posséde:

    Pour cela j'ai une requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $rq_cpt3=odbc_do($conn,"SELECT DISTINCT E7B8ZC,DYEVZE from osm_option   ");
    Je voudrais quelqu'chose du genre :

    abone1 : option15,option16,option22,option05,

    abone2 : option07,option16,option14,option03,

    etc

    J'ai reussi a arrivé à ce resultat mais le temps d'éxécution et beaucoup trop long : notament du fait que j'éxécute une requete dans une boucle while:

    Voici comment je fais:
    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
     
    //boucle pour afficher les abonné en ligne						
    echo"<table border=1> ";
    $abonne="";
    while($ligne=odbc_fetch_array($rq_cpt3))
    {
    if(($abonne=="") || ($abonne!=$ligne['abonne']))
    {
    $abonne=$ligne['abonne'];
    $rq=odbc_do($conn,"SELECT DISTINCT abonne,option from osm_option where abonne='$abonne' ");
    $cpt=odbc_num_rows($rq);
     
    echo"<tr><td>" .$abonne;
    for ($i=0;$i<$cpt;$i++)
    { 
    $uneligne=odbc_fetch_array($rq);
    echo "<td>"$uneligne['option']; 
    }
    echo"</tr>";
    }
    $abonne=$ligne['abonne'];
    }				
    echo" </table>";
    Je sais ce n'est pas trés jolie
    Quelqu'un saurait-il comment optimiser tout ça ?
    Merci d'avance

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2009
    Messages : 236
    Points : 348
    Points
    348
    Par défaut
    Pourquoi dans ton SELECT tu met abonne ? Tu cherche juste à retourner les options donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT option from osm_option where abonne='$abonne'
    Et tu les met dans une collection.
    Pensez à la balise [CODE].
    Aucune réponse aux questions par MP.

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Points : 47
    Points
    47
    Par défaut
    Mais puisque dans ma clause WHERE je mets abonne='$abonne' je suis obligé de le mettre dans le select sinon j'ai une erreur.

    Mais n'y a t-il pas une autre methode moin lourd d'afficher :

    abone1 : option15,option16,option22,option05,

    abone2 : option07,option16,option14,option03,


    ?

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2009
    Messages : 236
    Points : 348
    Points
    348
    Par défaut
    C'est faux, tu n'est pas obligé d'affiché une valeur sur laquelle tu fait une exception, pas besoin du DISTINCT non plus car tu n'as "normalement" pas de redondance d'option pour un abonné.
    Pensez à la balise [CODE].
    Aucune réponse aux questions par MP.

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Points : 47
    Points
    47
    Par défaut
    Merci de ces petits conseil gwharl, mais cela ne resoud pas mon problème d'optimisation

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 36
    Points : 62
    Points
    62
    Par défaut
    Tu pourrais ne faire qu'une seule requête et trier le résultat, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT abonne,option from osm_option where abonne IN ('abone1', 'abonne2', etc ...);
    Ce qui pourrait donner (attention je n'ai pas testé)
    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
    // On récupère tous les abonnés
    $abonnes = array();
    while($ligne=odbc_fetch_array($rq_cpt3))
    {
    	if(!in_array($ligne['abonne']))
    	{
    		$abonnes[]=$ligne['abonne'];
    	}
    }
     
    // On récupère les options des abonnés recherchés
    $rq=odbc_do($conn, "SELECT DISTINCT abonne,option from osm_option where abonne IN ('".implode("','", $abonnes)."') ");
    $cpt=odbc_num_rows($rq);
     
    // On groupes les options par abonné
    $aboneOptions = array();
    for ($i=0;$i<$cpt;$i++)
    { 
    	$uneligne=odbc_fetch_array($rq);
    	$aboneOptions[$ligne['abonne']][] = $uneligne['option'];
    }
     
     
    //boucle pour afficher les abonnés en ligne						
    echo"<table border=1> ";
    	for($aboneOptions as $abone => $options) {
    		echo "\t<tr>\n\t\t<td>$abone</td>";
    		for($options as $o) {
    			echo "\n\t\t<td>$o</td>";
    		}
    		echo "\n\t</tr>";
    	}
    echo" </table>";
    EDIT : tu pourrais même faire faire le trie des options par le SGBD en utilisant GROUPE BY

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Points : 47
    Points
    47
    Par défaut
    Merci westdigit pour ta réponse

    J'ai une erreur de syntaxe à ce niveau la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for($aboneOptions as $abone => $options) {

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 36
    Points : 62
    Points
    62
    Par défaut
    Ah oui dsl, remplace les deux for par des foreach
    (ca c'est à force de passer du java au php ^^)

  9. #9
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Points : 47
    Points
    47
    Par défaut
    Effectivement sa marchemieu avec foreach !

    Par contre j'ai une autre erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $rq_cpt3=odbc_do($conn,"SELECT E7B8ZC from osm_option group by E7B8ZC  ");
    // On récupère tous les abonnés
    $abonnes = array();
    while($ligne=odbc_fetch_array($rq_cpt3))
    {
    	if(!in_array($ligne['E7B8ZC']))
    	{
    		$abonnes[]=$ligne['E7B8ZC'];
    	}
    }
    Ligne de l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if(!in_array($ligne['E7B8ZC']))
    erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    in_array() expects at least 2 parameters, 1 given

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2009
    Messages : 236
    Points : 348
    Points
    348
    Par défaut
    Traduction : 2 paramètres requis, 1 donné.

    http://php.net/manual/fr/function.in-array.php
    Pensez à la balise [CODE].
    Aucune réponse aux questions par MP.

  11. #11
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 36
    Points : 62
    Points
    62
    Par défaut
    oups faut que j'aille dormir un peu ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(!in_array($ligne['abonne'],$abonnes))

  12. #12
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Points : 47
    Points
    47
    Par défaut
    Merci pour ces petites corrections

    Par contre mes options s'affichent mais pas mes abonnés

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    echo"<table border=1> ";
    foreach($aboneOptions as $abone=>$options) {
    echo "<tr><td>$abone</td>";
    foreach($options as $o) {
    echo "<td>$o</td>";
    }
    echo "</tr>";
    }
    echo" </table>";

  13. #13
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Points : 47
    Points
    47
    Par défaut
    J'ai trouvé en faite l'erreur se trouve au moment ou je rempli mon tableau à deux dimension:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // On groupes les options par abonné
    $aboneOptions = array();
    for ($i=0;$i<$cpt;$i++)
    { 
    $uneligne=odbc_fetch_array($rq);
    $aboneOptions[$ligne['abonne']][] = $uneligne['option'];
    }
    A la place de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $aboneOptions[$ligne['abonne']][] = $uneligne['option'];
    J'ai mis ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $aboneOptions[$uneligne['abonne']][] = $uneligne['option'];
    Mon fetch_array est stocké dans $uneligne et non pas dans $ligne

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

Discussions similaires

  1. [VS2005] Optimisation affichage d'un formulaire
    Par belfaigore dans le forum Windows Forms
    Réponses: 4
    Dernier message: 03/07/2009, 15h33
  2. Optimiser affichage requete
    Par Shivas dans le forum Langage SQL
    Réponses: 5
    Dernier message: 03/05/2008, 11h15
  3. [MySQL] optimisation affichage du résultat d'un select
    Par guiguimouk dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 30/04/2008, 10h26
  4. JLayeredPane : optimiser affichage
    Par Yannick_from_31 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 20/06/2007, 12h07
  5. Optimisation affichage 2D
    Par NiamorH dans le forum OpenGL
    Réponses: 25
    Dernier message: 10/04/2007, 10h21

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