Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/11/2007, 13h47   #1
Invité régulier
 
Inscription : octobre 2007
Messages : 22
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 22
Points : 7
Points : 7
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 :
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
Archalia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2007, 14h16   #2
Membre actif
 
Avatar de fenkys
 
Inscription : octobre 2007
Messages : 157
Détails du profil
Informations personnelles :
Âge : 45

Informations forums :
Inscription : octobre 2007
Messages : 157
Points : 181
Points : 181
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 :
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 :
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.
fenkys est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2007, 15h19   #3
Invité régulier
 
Inscription : octobre 2007
Messages : 22
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 22
Points : 7
Points : 7
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 :
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 :
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
Archalia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2007, 15h29   #4
Membre actif
 
Avatar de fenkys
 
Inscription : octobre 2007
Messages : 157
Détails du profil
Informations personnelles :
Âge : 45

Informations forums :
Inscription : octobre 2007
Messages : 157
Points : 181
Points : 181
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.
fenkys est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2007, 15h33   #5
Invité régulier
 
Inscription : octobre 2007
Messages : 22
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 22
Points : 7
Points : 7
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
Archalia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2007, 09h35   #6
Membre actif
 
Avatar de fenkys
 
Inscription : octobre 2007
Messages : 157
Détails du profil
Informations personnelles :
Âge : 45

Informations forums :
Inscription : octobre 2007
Messages : 157
Points : 181
Points : 181
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.
fenkys est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2007, 15h51   #7
Invité régulier
 
Inscription : octobre 2007
Messages : 22
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 22
Points : 7
Points : 7
heu une derniere petite question, je viens de remarquer ca.

Cette requete,boucle n'affiche pas les themes quand il n'y a pas de topic associé. J'ai beau avoir essayé de comprende pourquoi je n'y suis pas arrivé.

Un moyen d'y remedier ?
Archalia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2007, 16h19   #8
Membre actif
 
Avatar de fenkys
 
Inscription : octobre 2007
Messages : 157
Détails du profil
Informations personnelles :
Âge : 45

Informations forums :
Inscription : octobre 2007
Messages : 157
Points : 181
Points : 181
La requetes doit etre plus complexe pour ca.

Code :
1
2
3
SELECT theme.theme_id AS theme_id, nom_theme, ... 
FROM theme LEFT JOIN topic USING (theme_id)
ORDER BY theme.theme_id
Pas testé mais ca devrait marcher. LEFT JOIN effectue une jointure de toutes les lignes de la table de gauche avec les lignes de la table de droite, ou aucune s'il n'y en a aucune qui lui correspond.

Avant d'afficher un topic, tu dois maintenant vérifier qu'il y en a bien un (si pas de topic associé, les champs correspondants on la valeur null).

PS: la syntaxe SQL standard est LEFT OUTER JOIN, mais avec MySQL, OUTER est optionnel.
fenkys est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h15.


 
 
 
 
Partenaires

Hébergement Web