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 :

Jointure top longue ? [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Programmeur
    Inscrit en
    Mai 2012
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Mai 2012
    Messages : 55
    Points : 26
    Points
    26
    Par défaut Jointure top longue ?
    Bonjour à tous !
    J'ai fais une petite page qui permet d'afficher les historiques des clients, dans ma table des historiques j'ai des codes articles. J'aurais aimé afficher le libellé de ces articles et non pas les codes articles. Seul solution la jointure !
    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
    <?php
    	//initialisation des variables
    	$id_client = $_GET['id'];
    	$nb_enregistrement = 0;
     
    	echo'
    		<h1>Historique</h1>
    	';	
     
    	//requète de recherche des historiques
    	$rqt_histo = "SELECT Code_art, Date_Historique, Tarif, Qté, Cndt FROM Historique ORDER BY Date_Historique DESC";
    	$exec_histo = mysql_query($rqt_histo) or die ('Erreur lors de la requète de recherche d\'historique : '.mysql_error());
        //requète de jointure	
     
     
     
    	echo'<div style="height:350px;overflow:auto;"><table class="table_historique">
    			<tr>
    				<td>Identifiant Article</td><td>Date</td><td>Tarifs</td><td>Quantité</td><td>Conditionnement</td>
    			</tr>
    	';
    	while($data_histo = mysql_fetch_array($exec_histo)){
    		$nb_enregistrement ++;
    		//requète de "jointure" entre historique et article
    		$rqt_joint = 'SELECT ID_Article, Lib_Article, Code_Art FROM Article, CNDT WHERE ID_Article = "'.$data_histo[0].'"';
            $exec_joint = mysql_query($rqt_joint) or die ('Erreur lors de la requête de jointure : '.mysql_error());
    		$data_joint = mysql_fetch_array($exec_joint);
            $nom_art = $data_joint[1];
    		if($nb_enregistrement%2 == 0){
    			echo'	
    				<tr class="pair">
    					<td>'.$nom_art.'</td><td>'.$data_histo[1].'</td><td>'.$data_histo[2].'</td><td>'.$data_histo[3].'</td><td>'.$data_histo[4].'</td>
    				</tr>
    			';
    		}
    		else{
    			echo'	
    				<tr>
    					<td>'.$nom_art.'</td><td>'.$data_histo[1].'</td><td>'.$data_histo[2].'</td><td>'.$data_histo[3].'</td><td>'.$data_histo[4].'</td>
    				</tr>
    			';
    		}
    	}
    	echo'</table></div>
    		<br />
    		<a href="index.php?page=details_client&id='.$id_client.'"><input type="submit" value="Retour"></a>
    
    	';
    ?>
    Seul problème c'est qu'il m'affiche une erreur je cite :
    Citation Envoyé par WampServer
    Fatal error: Maximum execution time of 30 seconds exceeded in C:\wamp\www\xxx\include\page\historique.php on line 26
    Je ne sais plus où chercher :/

    Cordialement
    Awery

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Faudrait voir un peu la structure de ta table mais balancer des mysql_query dans un while c'est pas vraiment une bonne idée et c'est ce qui doit conduire au max_execution_time.

    Si ta conception de table est bonne tout doit pouvoir être récupéré en une seule requête.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Alors, à vue de nez, je dirais que tu remontes trop d'infos et/ou plusieurs fois la même chose.
    Tu peux envisager un système de pagination, histoire de limiter le nombre de données remontées et/ou revoir tes requêtes pour qu'elles consomment moins.
    On pourrait avoir la structure des tables ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Programmeur
    Inscrit en
    Mai 2012
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Mai 2012
    Messages : 55
    Points : 26
    Points
    26
    Par défaut
    En Une seul requête ? Comment fait-on ?
    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
    CREATE TABLE IF NOT EXISTS Article (
    	ID_Article VARCHAR(20) primary key,
    	Lib_Article VARCHAR(100),
    	Fam_Article VARCHAR(5)
     
    );
     
    CREATE TABLE IF NOT EXISTS Historique (
    	ID_Historique INT(15) PRIMARY KEY auto_increment,
    	Code_cli VARCHAR(20), 
    	Code_art VARCHAR(20), 
    	Date_Historique DATE NOT NULL,
    	Qté FLOAT(5),
    	Tarif FLOAT(5),
    	Cndt VARCHAR(20)
    );

  5. #5
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Je suppose que la colonne "Code_art" de Historique correspond à la colonne "ID_Article" de Article. Et la table CNDT elle a quelle tête ?
    Juste pour savoir, tu as combien d'enregistrements dans Historique ?

    Sinon, tu a peux toujours augmenter le temps limite avec set_time_limit (mais c'est vraiment en dernier recours)
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Programmeur
    Inscrit en
    Mai 2012
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Mai 2012
    Messages : 55
    Points : 26
    Points
    26
    Par défaut
    1171 pour le moment. Je sais que c'est un fichier assez gros.

    Edit :

    Attendez ! Mais je suis bête ! on veut savoir tous les historiques par apport à l'utilisateur que je récup en get et non tous les historiques de tous les utilisateurs !

    Edit :

    J'ai résolu le problème ! Merci pour votre attention.

  7. #7
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Citation Envoyé par Awery Voir le message
    En Une seul requête ? Comment fait-on ?
    J'extrapole un peu car je n'ai pas toutes les infos mais par exemple :
    En supposant que Code_Art = ID_Article et qu'il existe une table client où ID_Client = Code_cli tu pourrais récupéré tous les historique d'un utilisateur comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Date_Historique,Code_art,Lib_Article,Client_Name FROM  Historique
    INNER JOIN Article ON ID_Article = Code_art
    INNER JOIN Client ON ID_Client = Code_cli
    WHERE Code_cli = 5
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. [Oracle] Requête vraiment top longue via php
    Par Devether dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 09/01/2014, 22h24
  2. jointure trop longue à être exécutée
    Par moimemessssssssss dans le forum VBA Access
    Réponses: 4
    Dernier message: 21/12/2008, 15h12
  3. Jointure très longue (49 minutes)
    Par Daxey dans le forum Débuter
    Réponses: 7
    Dernier message: 23/08/2008, 20h19
  4. jointure extrêmement longue
    Par xenos dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/08/2007, 22h07
  5. jointure et top 1 ?
    Par isayus dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/09/2005, 16h07

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