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 :

Probléme optimisation création croisé dynamique [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 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
    Par défaut Probléme optimisation création croisé dynamique
    Bonjour à tous ,

    J'ai créé un croisé dynamique en procédant de la manière suivante :

    - création d'un tableau à deux dimension qui contient des abonnées avec leur options.

    ex :
    abonne1 | option 1 | option2 | option3
    abonne2 | option 2 | option3
    etc

    Voici le script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $aboneOptions = array();
    	while($uneligne=mysql_fetch_array($rq_abonne_options_codeService))
    	{
    		$aboneOptions[$uneligne['abonne']][] = "".rtrim($uneligne['options']). " (".rtrim($uneligne['code_service']).")";
    	}
    Ensuite, je créer dynamiquement une table MySQL qui recevra notre croisé dynamique qui ressemblera à cela:

    abonne | nom | prénom| adresse| option1| option2| option3
    -------------------------------------------------------------------------
    abonne1 | zaza | toto | ..........| X | X |
    abonne2 | zozo | titi | ..........| X | | X



    Les champs (abonne, nom, prénom, adresse) sont des champs fixe mais les options sont des champs variables :

    Voici le script SQL de la création de ma table dynamique
    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
     
    // creation d'une table dynamique
    $requete = "CREATE TABLE `extract_excel` (
      `abonne` text NOT NULL,
      `nom` text NOT NULL,
      `prenom` text NOT NULL,
      `adresse` text NOT NULL,
      `num_abonne` text NOT NULL,
      ";
     
    	while ($uneligne=mysql_fetch_array($rq_code_service)) 
    	{  
    		$requete.= "`".rtrim($uneligne['options']). " (".rtrim($uneligne['code_service']).")` text NOT NULL," ;//rtrim() permet de supprimer les espaces en fin de chaine 
    	}
     $requete .= "`date_deconnexion` date NOT NULL) ;";
    $creation_table=mysql_query($requete);
    mysql_query("ALTER TABLE `extract_excel` DROP `date_deconnexion`");
    Ensuite, je parcours le tableau à deux dimension, et lorsque je pointe sur un abonné j'injecte des données le concernant dans la table dynamique , et je met une croix en dessous de la bonne option avec une requête update :

    Voici le script de mon tableau croisé dynamique :
    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
     
    $i=0;
    $tab = array();
    foreach($aboneOptions as $abone=>$options) 
    {
    $rq_2bis=mysql_query("SELECT DISTINCT abonne,nom,prenom,adresse from croise_dynamique where  abonne ='$abone' ");
    $ligne=mysql_fetch_array($rq_2bis);
    	$nom=$ligne['num_compte'];
    	$prenom=$ligne['carte_jumelle'];
    	$adresse=$ligne['fax'];
    		// on injecte les donnees dans une table pour l'extraction excel 
    		mysql_query ("insert into extract_excel(`abonne`,`nom`,`prenom`,`adresse`) values('$abonne','$nom','$prenom','$adresse')");
    		$j=0;
    		$cpt_true=0; // compteur pour determiner si option trouvé
    			//on parcours les options
    			foreach($options as $o) 
    			{
    				//tant qu'on a pas trouvé l'option de l'abonne on compare l'option  de la 'colone= $option[$j]' avec l'option de 'l'abonne=$o'
    				if (isset($option[$j]))
    				{
    				while ((($cpt_true!=1)|| ($cpt_true==0)  ) and $j<=$nb_tablo)
    				{
    					if($option[$j]==$o) 
    					{
    					// on injecte les valeur de une table 
    					mysql_query ("update extract_excel set`$o` ='X' ");
    					$j++;
    					$cpt_true=1;//1
    					}
    					else
    					{
    					$j++;
    					}
    				}
    				$cpt_true=0;
    				}
    			}	
    }
    Le souci ici est que lorsqu’il y a 30 000 abonné par exemple le traitement est beaucoup trop long:
    Quelqu’un aurait-il une solution d'optimisation?
    Je désespère

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    L'optimisation ne peut se faire que dans MySql, vu le nombre de données, la manière itérative est à proscrire (comme tu l'a constaté par toi-même)
    Donnes la structure des tables gérant toutes ces informations.

  3. #3
    Membre confirmé
    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
    Par défaut
    Merci de ta réponse

    Voici la structure de ma table mysql qui rempli mon tableau à deux dimensions :
    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
     
    CREATE TABLE IF NOT EXISTS `croise_dynamique` (
      `code_ent` text NOT NULL,
      `num_compte` text NOT NULL,
      `abonne` text NOT NULL,
      `nom_utili` text NOT NULL,
      `ref_client` text NOT NULL,
      `num_gsm` text NOT NULL,
      `num_sim` text NOT NULL,
      `carte_jumelle` text NOT NULL,
      `fax` text NOT NULL,
      `data` text NOT NULL,
      `imei` text NOT NULL,
      `code_tarif` text NOT NULL,
      `date_connexion` text NOT NULL,
      `dure_contrat` text NOT NULL,
      `options` text NOT NULL,
      `code_service` text NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    Voici la structure de ma table dynamique qui va recevoir mon tableau croisé dynamique:
    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
     
    CREATE TABLE IF NOT EXISTS `extract_excel` (
      `code_groupe` text NOT NULL,
      `code_entreprise` text NOT NULL,
      `entite` text NOT NULL,
      `compte_client` text NOT NULL,
      `num_abonne` text NOT NULL,
      `utilisateur` text NOT NULL,
      `reference` text NOT NULL,
      `gsm` text NOT NULL,
      `num_sim` text NOT NULL,
      `num_carte_jumelle` text NOT NULL,
      `num_fax` text NOT NULL,
      `num_data` text NOT NULL,
      `num_imei` text NOT NULL,
      `code_tarif` text NOT NULL,
      `date_connexion` text NOT NULL,
      `duree_contrat` text NOT NULL,
      `la messagerie vocale (100021)` text NOT NULL,
      `la conférence mobile (100025)` text NOT NULL,
      `option visiophonie (100026)` text NOT NULL,
      `mode international (100060)` text NOT NULL,
      `la présentation du numéro (100130)` text NOT NULL,
      `secret appel par appel (100140)` text NOT NULL,
      `téléchargement du répertoire (100220)` text NOT NULL,
      `abonnement permanent (200280)` text NOT NULL,
      `Ajout couverture monde (DSI030)` text NOT NULL,
      `pass à l'usage (PGPD00)` text NOT NULL,
      `service WIFI (WIFI01)` text NOT NULL,
      `WIFI internet (WIFIFI)` text NOT NULL,
      `roaming WIFI international (WIFIIN)` text NOT NULL,
      `roaming WIFI national (WIFINA)` text NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

  4. #4
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Non, on s'est pas compris, c'est pas la structure des tables à remplir qui est importante mais la structure des tables gérant tes abonnées et leurs options.
    Histoire de voir s'il est possible de procéder de manière ensembliste.
    je parcours le tableau à deux dimension, et lorsque je pointe sur un abonné j'injecte des données le concernant dans la table dynamique
    C'est pour éviter cette étape.

  5. #5
    Membre confirmé
    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
    Par défaut
    Il s'agit du 1er script, il gère les abonnes (3eme champs) et les options (avant dernier champs)
    J' établie mon croisé dynamique à partir de cette table.

  6. #6
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Comment tu stockes tes options ? A la queue le leu ? Avec un séparateur, texte code ?

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 23/04/2014, 08h54
  2. [XL-2010] Problème lors de la création de tableau croisé dynamique avec vba
    Par juju05 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 26/07/2012, 17h10
  3. Réponses: 1
    Dernier message: 04/01/2012, 17h12
  4. problème compréhension Tableau Croisé Dynamique
    Par Nako_lito dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/11/2009, 11h30
  5. Problème de tableaux croisé dynamique
    Par ANTMA dans le forum Excel
    Réponses: 3
    Dernier message: 21/12/2007, 14h39

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