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 :

[SQL] Probleme jointure de tables et d'affichage


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Par défaut [SQL] Probleme jointure de tables et d'affichage
    Bonjour,

    Etant débutant j'ai quelque probleme avec ma requete de jointure et d'affichage.

    Voila déjà les tables:

    theme : **
    - Id
    - Nom_theme
    - nbr_topic
    - nbr_mess

    topic : **
    - Id
    - Nom_topic
    - ref_theme
    - nbr_mess


    Mon but c'est de pouvoir afficher ceci:

    Theme 1:

    liste des topic


    Theme 2:
    liste des topic

    etc etc

    J'ai donc penser à utiliser deux boucles imbriquées dont voici le code:

    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
    $reponse = mysql_query('SELECT Id, Nom_theme FROM theme  ORDER BY Id') OR die(mysql_error());
    $reponsebis = mysql_query('SELECT * FROM topic JOIN theme ON topic.ref_theme = theme.Id   ORDER BY Nom_topic') OR die(mysql_error());
    
    while ($donnees = mysql_fetch_array($reponse))
    {
    
    
     
    
            echo '<br/><br/><strong>- '.$donnees['Nom_theme'].' </strong> <br/>';
    		
    		$reponsebis = mysql_query('SELECT * FROM topic JOIN theme ON topic.ref_theme = theme.Id  WHERE topic.ref_theme = ??? ORDER BY topic.Id') OR die(mysql_error());
    		
    		while ($donneesbis = mysql_fetch_array($reponsebis))
    {
    
    		echo '- '.$donneesbis['Nom_topic'].' <br/>';
    		
     }
      
    	}

    Voila , mon problème arrive au niveau des ???. En réalité si j'enlève le where, il me met la totalité des topics dans chaque thème. Si je met une valeur fixe par exemple 1 ( qui correspond a l'Id du premier thème ) , il me met partout les topics du thème avec l'Id 1.

    J'ai donc pensé à mettre une variable, cependant ca ne marche pas. Apparemment il refuse les variables ou alors ma syntaxe n'etait pas bonne.

    J'ai pensé que l'idéal serait de mettre $donnees['Id'] à la place des ???. Cependant ça cause une erreur. Même en stockant cette valeur dans une autre variable genre $i, quand je met $i à la place des ??? j'ai également une erreur..

    j'avoue ne plus savoir quoi faire.

    Mon algo est sans doute faux, je ne sais pas.

    need help, merci d'avance.



    Cordialement,

    Archalia

  2. #2
    Membre chevronné Avatar de fenkys
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 376
    Par défaut
    J'aurai nommé différement les colonnes id en theme_id et topidc_id, j'aurai aussi nommé la colonne ref_theme en theme_id. Tout cela pour faciliter les jointures.

    Ma requête devient unique et plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT theme.theme_id AS theme_id, nom_theme, ... 
    FROM theme NATURAL JOIN topic 
    ORDER BY theme.theme_id
    Cette requete va effectuer une jointure en prenant les colonnes de même nom. Tu as une colonne theme_id dans tes deux tables et MySQL va donc se servir d'elle. Ca tombe bien, c'est exactement ce que l'on veut faire. Plus simple que tes trois requetes n'est ce pas ? Et toutes les infos nécessaires sont ramenée bien classées en une seule fois.

    Ensuite une seule boucle suffit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $theme_id = 0;
    while ($donnees = mysql_fetch_array($resultat))
    {
        if ($theme_id != $donnees['theme_id'])
        {
            // Affiche ici tes infos de theme
            ...
            $theme_id = $donnees['theme_id'];
        }
        // Affiche ici tes infos de topic.
        ...
    }
    Autrement pour le problème particulier que tu évoquais, c'est simplement que tu utilisais des simples quotes au lieu de doubles, tes variables n'étaient donc pas interprétés dans ta chaine de caractères.

  3. #3
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Par défaut
    merci de ta réponse, je me rend compte que j'etais vraiment dans le faux.

    Cependant j'ai encore un soucis.

    J'ai apporté les modifications que tu suggerais, seulement lorsque la requête s'execute voila ce que ca m'affiche:

    - INEX

    -
    -

    - Personnel

    -
    -

    - Général

    -
    -
    -

    - Intranet

    -
    -
    -


    sachant que les - correspondent bien au nombre de topic par theme donc c'est deja bien. le soucis c'est qu'il n'arrive pas à retrouver le valeur de $donnees['Nom_topic'].

    Ce qui est normal puisque la requete est :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT theme.theme_id AS theme_id, nom_theme, ... 
    FROM theme NATURAL JOIN topic 
    ORDER BY theme.theme_id

    Donc comment récupérer cette valeur ?

    cordialement






    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
    $reponse = mysql_query( 'SELECT theme_id, Nom_theme FROM theme  NATURAL JOIN topic ORDER BY theme_id ');
     
     
    $theme_id = 0;
    while ($donnees = mysql_fetch_array($reponse))
    {
        if ($theme_id != $donnees['theme_id'])
        {
            // Affiche ici tes infos de theme
            echo '<br><br/><strong>- '.$donnees['Nom_theme'].' </strong><br/>';
     
            $theme_id = $donnees['theme_id'];
        }
        // Affiche ici tes infos de topic.
       echo '<br/>- '.$donnees['Nom_topic'];
     
    }

    voila mon code modifié si jamais

  4. #4
    Membre chevronné Avatar de fenkys
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 376
    Par défaut
    Mes point de suspension correspondent à du code manquant, aussi bien dans le PHP que dans la requête. Dans la requête tu remplaces tous ces points par les colonnes que tu veux récuperer (séparée par des virgules) afin de pouvoir les récuperer dans ton tableau $donnees.

    Au passage, pour le HTML, tu as les balises <dl>,<dt> et <dd> pour disposer les infos comme tu le désires. C'est mieux que des <br> et des tirets.

  5. #5
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Par défaut
    ha oki suffisait de rajouter la colonne, je pensais que j'allais devoir rajouter une requete...

    alala quel noob je suis.


    Merci beaucoup, probleme résolu

  6. #6
    Membre chevronné Avatar de fenkys
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 376
    Par défaut
    On est tous passé par là. Mon premier emploi a d'ecrire des programmes pour Oracle alors que je ne connaissais pa un mot de SQL au moment de l'embauche.

Discussions similaires

  1. Requête sql avec jointure et table vide (ou tuple nulle)
    Par Aenur56 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 29/04/2010, 14h10
  2. [SQL] SELECT jointure 7 Tables
    Par php4life dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 29/01/2007, 09h38
  3. [SQL] probleme d'affichage contenu de variables
    Par taka10 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 02/06/2006, 15h03
  4. Probleme jointure d'une table sur elle même
    Par fred64 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 18/05/2006, 15h01
  5. [SQL Server] Jointure entre 2 tables et performances
    Par rmeuser dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/04/2006, 10h12

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