Version complète: sur le forum Webmaster Hub : Pb de jointure
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
fabien62
Bonjour,

J'ai un petit probléme de jointure, j'ai beau chercher, je ne trouve pas sad.gif

J'ai 2 tables sur ma base de données,
1 table avec les categories principales, et une table avec les sous categories.

Ce qui nous donne (exemple):

Legumes :
carottes
salade
tomate

Fruit :
Orange
banane
pomme

Mais j'ai un probléme d'affichage du genre :
legumes
carottes
legumes
salade
legumes
tomate.

Je ne parviens pas a faire comme le premier exemple.

Voici un exemple de code ( car j'en es essayer beaucoup ) que j'ai utilisé :

CODE
$rep= mysql_query("SELECT * FROM categories, listecategories
WHERE categories.id = listecategories.categp");


while($donnees=mysql_fetch_array($rep))

{
//catégories principale

echo "$donnees['id'] <br/>";
echo "$donnees['nom'] <br/>";
echo "$donnees['descri'] <p>";
echo '---------------------<br/>';

//sous catégories
echo $donnees['nom2'];
echo '<br/>';
echo $donnees['descri2'];
echo '<p>';
}


Un petit coup de main serai le bienvenue.

Merci
Damien L
Normal.

Il faut que tu procède de la façons suivante :

Commençons par la structure des tables

####TABLE 1 (categories)####

| cat_id | cat_nom |
| 1 | Legumes |
| 2 | Fruits |

####TABLE2 (listecategories)####

| s_cat_id | cat_id | s_cat_nom |
| 1 | 1 | Carottes |
| 2 | 2 | Oranges |
| 3 | 1 | Salades |

CODE
$rep= mysql_query("SELECT a.cat_nom, b.s_cat_nom FROM categories a, listecategories b WHERE b.cat_id = a.cat_id");

while($donnees=mysql_fetch_array($rep))
{
       print $donnees['s_cat_nom'].' -> '.$donnees['cat_nom'].'<br />';
}


Ce qui t'affichera :
Carottes -> Légumes
Oranges -> Fruits
Salades -> Légumes
Damien L
Oups, après relecture, je ne répond pas à ta question ...

Je recommence avec mes structures de tables précédentes.

CODE
$rep_cat= mysql_query("SELECT * FROM categories");

while($donnees_cat=mysql_fetch_array($rep_cat))
{
       print $donnees_cat['cat_nom'].'<br />';

       $rep_sous_cat= mysql_query("SELECT * FROM listecategories WHERE cat_id=$donnee_cat['cat_id']");
      
       while($donnees_sous_cat=mysql_fetch_array($rep_sous_cat))
       {
               print '&nbsp;'.$donnees_sous_cat['s_cat_nom'].'<br />';
        }

        print '<br />';
}
fabien62
Je te remercie, mais j'obtient un parse error :

Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in


CODE

$rep_cat= mysql_query("SELECT * FROM categories");

while($donnees_cat=mysql_fetch_array($rep_cat))
{
print $donnees_cat['cat_nom'].'<br />';

$rep_sous_cat= mysql_query("SELECT * FROM listecategories WHERE cat_id=$donnees_cat['cat_id']");

while($donnees_sous_cat=mysql_fetch_array($rep_sous_cat))
{
print '&nbsp;'.$donnees_sous_cat['s_cat_nom'].'<br />';
}

print '<br />';
}


//fintest


sa viendrais de cette ligne :
$rep_sous_cat= mysql_query("SELECT * FROM listecategories WHERE cat_id=$donnees_cat['cat_id']");
xpatval
Essaie comme cela ?
CODE
$rep_sous_cat= mysql_query("SELECT * FROM listecategories WHERE cat_id='". $donnees_cat['cat_id'] ."'");


xpatval
fabien62
Merci,

Je n'es plus de parse error mais :

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in

En faite j'ai deux tables :

1 table categories
Avec les champs
id - nom - descri(pour description)

1 table listecategories
Avec les champs
id - nom2 - descri2 - et categp qui reprend l'id de la table categorie ( categp=idcategories )

j'ai donc fait sa :
CODE

$rep_cat= mysql_query("SELECT * FROM categories");

while($donnees_cat=mysql_fetch_array($rep_cat))
{
print $donnees_cat['cat_nom'].'<br />';

$rep_sous_cat= mysql_query("SELECT * FROM listecategories WHERE cat_categp='". $donnees_cat['cat_id'] ."'");

while($donnees_sous_cat=mysql_fetch_array($rep_sous_cat))
{
print '&nbsp;'.$donnees_sous_cat['s_cat_nom2'].'<br />';
}

print '<br />';
}

Merci

Edit j'ai fait un or exit(mysql_error() . "<br/>$requete"); sur rep_sous_cat j'ai trouver cette erreur :
suite à sa j'ai mit un ' entre cat_categp>'cat_categp' je n'es plus d'erreur mais rien ne s'affiche.
Damien L
Désolé j'ai tapé mon code d'exemple à l'arrache sans le tester nonono.gif

Voila une version corrigé :

CODE
$rep_cat= mysql_query("SELECT * FROM categories");

while($donnees_cat=mysql_fetch_array($rep_cat))
{
       print $donnees_cat['cat_nom'].'<br />';

       $rep_sous_cat= mysql_query("SELECT * FROM listecategories WHERE cat_id=".$donnees_cat['cat_id']);
      
       while($donnees_sous_cat=mysql_fetch_array($rep_sous_cat))
       {
               print '&nbsp;- '.$donnees_sous_cat['s_cat_nom'].'<br />';
        }

        print '<br />';
}
xpatval
Mais avec cette jointure, une seule requête devrait suffire, non ?
fabien62
la sa fonctionne comme sa, mais pas trés propre :
CODE

$rep_cat= mysql_query("SELECT * FROM categories");

while($donnees_cat=mysql_fetch_array($rep_cat))
{
print $donnees_cat['nom'].'<br />';

$rep_sous_cat= mysql_query("SELECT * FROM listecategories WHERE categp='". $donnees_cat['id'] ."'") or exit(mysql_error() . "<br/>$requete");

while($donnees_sous_cat=mysql_fetch_array($rep_sous_cat))
{
echo $donnees_sous_cat['nom2'];
echo '<br/>';
}

print '<br />';
}


J'essaie celui que tu viens de mettre et je te dit quoi, merci smile.gif

Fonctionne pas :
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in

J'ai fait quelques modifs sur ton dernier ajout, c'est ok.

Un grand merci à toi a_thumbsup_20.gif
Damien L
CITATION(xpatval @ dimanche 20 avril 2008 à 15:04) *
Mais avec cette jointure, une seule requête devrait suffire, non ?


Il n'y a pas de jointure là.

Par contre, si quelqu'un a une solution en faisant une jointure, ça m'intéresse.
xpatval
CITATION(Damien L @ dimanche 20 avril 2008 à 15:12) *
Il n'y a pas de jointure là.


Ah, pour moi, il y en a une. Et elle est d'ordre 1-N.

Rapidement:

Table 1 (categories):
id_cat
nom

Table 2 sous-categories:
id_ss_cat
id_cat (le champ de jointure = id_cat de la Table1)
nom


Ensuite, ta requête:
CODE
Select categories.nom, sous-categories.nom from categories, sous-categories where categories.id_cat = sous-categories.id_cat


A moins que je n'ai rien compris à la question...
Damien L
Oui, il y a bien une jointure dans mon premier exemple et ton exemple également.

Mais pas dans le dernier code que j'ai donné.

Avec une jointure, je sais faire ça :

Carottes -> Légumes
Oranges -> Fruits
Salades -> Légumes

Mais pas ça :

Légumes :
- carottes
- salade
- tomate

Fruit :
- orange
- banane
- pomme
xpatval
Alors dans ce cas, il ne s'agit plus d'un problème de requête, mais d'affichage, donc de PHP.
Tu dois d'abord initialiser une variable à blanc
CODE
$old_cat = "";

Puis tu effectues la (seule) requête
CODE
Select categories.nom AS categ, sous-categories.nom AS ss_categ from categories, sous-categories where categories.id_cat = sous-categories.id_cat
.
Dans la boucle, tu testes la valeur de la variable $old_cat.
CODE
while($i = mysql_fetch_array(.....))
{
   If ($old_cat == "")
   {
      echo $i['categ']."<br />";
      echo $i['ss_categ']."<br />";
   }
   elseif ($old_cat != "") || ($old_cat != $i['categ'])
   {
      echo $i['categ']."<br />";
      echo $i['ss_categ']."<br />";
   }
   else echo $i['ss_categ']."<br />";
   $old_cat = $i['categ'];
}

A parfaire probablement, mais c'est le principe.

xpatval
Damien L
Ha oui, je vois !

C'est en effet beaucoup moins lourd qu'une double requête smile.gif
Portekoi
Tu peux aussi utiliser un "CASE" qui est un "IF" à la SQL
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.