Autojointure...

MK
Invité n'ayant pas de compte PHPfrance

13 févr. 2006, 19:00

Bonjour, ça fait des heures que je galère pour essayer de m'en sortir avec une autojointure, mais je n'y arrive pas.
J'ai donc un forum en PHP, et là, il est question de la page qui doit afficher les messages disponibles dans une catégorie du forum. C'est donc un forum divisé en catégories/ sous catégories comme phpBB. En l'occurence, j'essaye d'afficher l'arborescence.... C'est à dire, le nom du et l'id de la ctatégorie mère du forum dans lequel on est (à partir du $id qui est définit dans l'URL)...
Voici l'architecture de la table :

Code : Tout sélectionner

CREATE TABLE `forums` ( `IdRub` int(11) NOT NULL auto_increment, `NameRub` text NOT NULL, `IdRubMere` int(11) NOT NULL default '0', PRIMARY KEY (`IdRub`) ) TYPE=MyISAM AUTO_INCREMENT=21 ;
Si l'IdRubMere = '0', c'est que l'insertion désigne une catégorie mère, sinon, IdRubMere désigne la catégorie mère de l'insertion. L'insertion désigne lors une rubrique qui possède une catégorie mère.

Revenons en à la page d'affichage de l'index des messages (viewforum). Il y a donc un $id qui est défini dans l'URL. Il désigne IdRub à chercher dans la base (il s'agit d'une rubrique). Et on veut le nom associé à cette rubrique (NameRub), mais également le nom de la catégorie mère, en passant donc par l'IdRubMere (étant donné qu'il s'agit d'une rubrique, IdRubMere est définit).

Voici le code de ma requete SQL qui ne fonctionne pas :

Code : Tout sélectionner

$sql = "SELECT R1.NameRub, R1.IdRubMere, R2.IdRub, R2.NameRub FROM forums R1 INNER JOIN forums R2 ON (R1.IdRubMere = R2.IdRub) WHERE R1.IdRub='$id'"; $result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); $foruminfos = mysql_fetch_array($result); echo "Nom de la rubrique du forum". $foruminfos['R1.NameRub']; echo "Nom de la catégorie mère de la rubrique du forum". $foruminfos['R2.NameRub'];
Cette requête n'affiche tout simplement ... rien !

D'avance merci à ceux qui pourront m'aider

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

13 févr. 2006, 19:29

Salut,
as tu testé la requete directement dans phpmyadmin, pour verifier si retour il y a ?

sinon ton affichage ne fonctionnera pas de toutes les façons, car il ne faut pas faire appel au nom du champ préfixé d'un alias lors de l'affichage => R2.NameRub.

essaie avec:
<?
$sql = "SELECT R1.NameRub as rub1 , R1.IdRubMere, R2.IdRub, R2.NameRub as rub2 FROM forums R1 INNER JOIN forums R2 ON (R1.IdRubMere = R2.IdRub) WHERE R1.IdRub='$id'";
   (...)
?>
   Nom de la rubrique du forum <?php echo $foruminfos['rub1']; ?> <br />
Nom de la catégorie mère de la rubrique du forum <?php echo $foruminfos['rub2']; ?>
avec 2 alias rub1 et rub2 pour R1.NameRub et R2.NameRub

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Invité
Invité n'ayant pas de compte PHPfrance

13 févr. 2006, 19:52

Effectivement, merci, il fallait utiliser les alias :)
Bon alors, j'ai une deuxième petite question par rapport à l'index des forums... Pour l'affichage des rubriques/ sous rubriques (comme à l'index de ce forum) : voici mon code, mais le problème, c'est qu'il contient une boucle l'une dans l'autre... Ce code est il donc optimisé (je précise que je l'ai trouvé dans un magazine informatique)

Code : Tout sélectionner

$sql = "SELECT IdRub, IdRubMere, NameRub FROM forums"; $result1 = mysql_query($sql); while ($niveau1 = mysql_fetch_array($result1)) { if($niveau1['IdRubMere']==0) { echo $niveau1["NameRub"]; // Affichage du nom de la catégorie mère } $result2 = mysql_query($sql); while ($niveau2 = mysql_fetch_array($result2)) { if ($niveau2['IdRubMere']==$niveau1['IdRub']) { echo '<a href="....">'.$niveau2["NameRub"].'</a>'; // Affichage du nom du forum } } }
Ce code me semble tout de même assez lourd... Je vous demande donc votre avis, sachant que ça fonctionne très bien :)
D'avance merci

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

13 févr. 2006, 19:58

pourquoi est ce que tu n'utilise pas la requete précédente ? ce qui te permettras de ne faire qu'une seule boucle en principe.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

MK
Invité n'ayant pas de compte PHPfrance

13 févr. 2006, 21:05

:roll: Mais oui, je suis bête ... Ce n'est donc pas gênant d'utiliser de nombreux alias (puisque j'ai simplifié pour l'exemple..., mais il y a d'autres champs).
Par ailleurs, sur la page d'affichage du topic, j'ai besoin de récupérer le nom du topic, puis le nom de la rubrique etc à partir du n° de topic. Est ce qu'on peut faire trois jointures dans une même requête ?

MK
Invité n'ayant pas de compte PHPfrance

13 févr. 2006, 22:44

[quote="Truc"]pourquoi est ce que tu n'utilise pas la requete précédente ? ce qui te permettras de ne faire qu'une seule boucle en principe.[/quote]
Voilà donc j'ai fait un essai, mais c'est pas encore tout à fait ça....

[code]$sql = "SELECT R1.NameRub as rub1, R1.IdRub as id1, R2.IdRubMere as id2, R2.NameRub as rub2 FROM forum_rub R1 INNER JOIN forum_rub R2 ON (R1.IdRub = R2.IdRubMere) WHERE R1.IdRubMere=0";
$result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
while ($niveau1 = mysql_fetch_array($result))
{
if(!empty($niveau1['rub1']))
{
echo '<b>'.$niveau1['rub1'].'</b><br />'; //Catégorie mère
}
if ($niveau1['id1']==$niveau1['id2'])
{
echo $niveau1['rub2'].'<br />'; // Rubriques du forum (= sous catégories)
}
}[/code]
Le problème est qu'il affiche la catégorie mère correspondante avant chaque rubrique du forum. Or je voudrais que chaque catégorie mère ne soit affichée qu'une seule fois, et que les rubriques de chaque catégorie s'affichent sous sa catégorie mère. En fait, le principe de l'arborescence : les sous catégorie s'affichent sous la catégorie mère (qui ne s'affiche qu'une fois).
D'avance merci

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

13 févr. 2006, 22:55

Ton problème se situe surtout niveau SQL... il y a donc déja des sujet similaires qui s'y trouvent 1. et 2.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute