Jointure cat/sous cat d'une meme table
Dernière réponse : dans Programmation
Hello everyone
Je coince sur une requete surement simple pour les plus confirmer d'entre vous pour une jointure ... qui n'en ai pas une, je m'explique, j'ai fait une table :
**********
Le résultat escompté à l'affichage :
*******
Ma requete SQL actuelle :
Mais sa cafouille car j'ai une erreur sql "supplied argument is not a valid MySQL result resource" blablabla ... je vois pourtant comment je dois faire dans ma tête ... mais je n'arrive pas à l'appliquer de façon logique sur la structure de la requete, et j'aimerais eviter de faire une seconde requete sql dans la boucle car je vais pas faire 8 requete pour afficher les sous cat ... je sais que l'on peut le faire, je l'ai déja fait une fois il y'a pas mal de temps, et je remet pas la main dessus
Merci beaucoup pour le petit aiguillage
Je coince sur une requete surement simple pour les plus confirmer d'entre vous pour une jointure ... qui n'en ai pas une, je m'explique, j'ai fait une table :
**********
Le résultat escompté à l'affichage :
*******
Ma requete SQL actuelle :
Citation :
SELECT a.id_categorie, a.nom_categorie, b.nom_categorie AS souscat FROM categorie a, categorie b WHERE a.id_parent = 0 AND b.id_categorie = a.id_categorieMais sa cafouille car j'ai une erreur sql "supplied argument is not a valid MySQL result resource" blablabla ... je vois pourtant comment je dois faire dans ma tête ... mais je n'arrive pas à l'appliquer de façon logique sur la structure de la requete, et j'aimerais eviter de faire une seconde requete sql dans la boucle car je vais pas faire 8 requete pour afficher les sous cat ... je sais que l'on peut le faire, je l'ai déja fait une fois il y'a pas mal de temps, et je remet pas la main dessus
Merci beaucoup pour le petit aiguillage
Autres pages sur : jointure cat cat table
Lassé par la pub ? Créez un compte
Je ne vois que deux options:
Pour n'avoir que les sous-catégories (donc les catégories vides n'apparaissent pas):
Pour avoir les sous-catégories et aussi les catégories vides:
Pour n'avoir que les sous-catégories (donc les catégories vides n'apparaissent pas):
SELECT a.id_categorie, a.nom_categorie, b.nom_categorie AS souscat
FROM categorie a, categorie b
WHERE b.id_categorie = a.id_categorie
Pour avoir les sous-catégories et aussi les catégories vides:
SELECT a.id_categorie, a.nom_categorie, b.nom_categorie AS souscat
FROM categorie a
LEFT JOIN categorie b ON (b.id_categorie = a.id_categorie)
Merci crazy de ton intervention, mais ta requete affiche une deuxieme colonne identique a toute les catégories de la table :
**********
Enfait, les 8 premiere catégories avec id_parent = 0 sont les catégorie principales, donc les seules à etre affichée dans un premier temps, puis, en dessous doit s'affiché les sous catégories qui correspondent à chaque catégories principale avec la valeur "id_parent", mais je crois pas que l'on puisse faire grand chose (après avoir dormi
) car hier soir j'avais commencé un truc comme ça :
<?php
$req = "SELECT a.id_categorie, a.nom_categorie, b.nom_categorie AS souscat FROM categories a, categories b WHERE a.id_parent = 0 and b.id_categorie = a.id_categorie";
$res = mysql_query($req);
while($aff=mysql_fetch_object($res)) {
echo '<b><a href="">'.$aff->nom_categorie.'</a></b> <br /> '.$aff->souscat.'<br />';
echo '<br />';
}
?>
(Ca c'est censé etre le résultat comme montré dans mon premier post, avec les catégories principale en gras, et les sous cat en dessous)
mais enfait c'est débile car vu qu'il y'a une seul boucle qui affiche les catégories principales, je vois pas comment les sous cat pourrait s'affiché en dessous dans une seconde "boucle" sans faire un second while avec une deuxieme requete s'incrustant dans la première ... je crois que j'ai fais de la merde enfait ... tu peut me confirmé ? ca m'aiderait à avoir la conscience tranquille sur cette partie
je te remercie
**********
Enfait, les 8 premiere catégories avec id_parent = 0 sont les catégorie principales, donc les seules à etre affichée dans un premier temps, puis, en dessous doit s'affiché les sous catégories qui correspondent à chaque catégories principale avec la valeur "id_parent", mais je crois pas que l'on puisse faire grand chose (après avoir dormi
) car hier soir j'avais commencé un truc comme ça :Citation :
<?php
$req = "SELECT a.id_categorie, a.nom_categorie, b.nom_categorie AS souscat FROM categories a, categories b WHERE a.id_parent = 0 and b.id_categorie = a.id_categorie";
$res = mysql_query($req);
while($aff=mysql_fetch_object($res)) {
echo '<b><a href="">'.$aff->nom_categorie.'</a></b> <br /> '.$aff->souscat.'<br />';
echo '<br />';
}
?>
(Ca c'est censé etre le résultat comme montré dans mon premier post, avec les catégories principale en gras, et les sous cat en dessous)
mais enfait c'est débile car vu qu'il y'a une seul boucle qui affiche les catégories principales, je vois pas comment les sous cat pourrait s'affiché en dessous dans une seconde "boucle" sans faire un second while avec une deuxieme requete s'incrustant dans la première ... je crois que j'ai fais de la merde enfait ... tu peut me confirmé ? ca m'aiderait à avoir la conscience tranquille sur cette partie
je te remercie
En fait, tout dépend de ce que tu veux afficher.
Voici ce que je ferais très simplement:
Voici ce que je ferais très simplement:
<?php
$sql = "SELECT cat.id_categorie, cat.nom_categorie, scat.id_categorie AS sid, scat.nom_categorie AS sname
FROM categories scat
LEFT JOIN categories cat ON (scat.id_parent=cat.id_categorie)
WHERE scat.id_parent > 0
ORDER BY cat.id_categorie";
$res = mysql_query($sql);
$cat = '';
while($aff=mysql_fetch_object($res)) {
if ($aff->nom_categorie != $cat) {
echo '<b><a href="', $aff->id_categorie, '">', $aff->nom_categorie, '</a></b> <br />', chr(13), chr(10);
$cat = $aff->nom_categorie;
}
echo $aff->souscat, '<br />', chr(13), chr(10);
}
Petite erreur sur la requête, il faut joindre le id_categorie avec le id_parent
Si tu reprends les requêtes de crazycat, il faut utiliser le id_parent. Soit:
ou
Edit: grillé
Si tu reprends les requêtes de crazycat, il faut utiliser le id_parent. Soit:
SELECT a.id_categorie, a.nom_categorie, b.nom_categorie AS souscat FROM categorie a, categorie b WHERE a.id_categorie = b.id_parent
ou
SELECT a.id_categorie, a.nom_categorie, b.nom_categorie AS souscat FROM categorie a LEFT JOIN categorie b ON (b.id_parent = a.id_categorie)
Edit: grillé
Si je puis me permettre de te donner un petit conseil, comme à tous ceux qui lisent ce sujet: évitez les raccourcis et les jointures implicites si vous ne les maitrisez pas.
Moi même, je pense les maitriser mais je préfère les écrire de manière bien explicite, d'autant que çe ne fait rien perdre en performances et que ça permet de bien décomposer ses requètes.
Moi même, je pense les maitriser mais je préfère les écrire de manière bien explicite, d'autant que çe ne fait rien perdre en performances et que ça permet de bien décomposer ses requètes.
Donc le mieux, vu que j'ai du mal avec les jointures (ha bon ?
) cela revient au même d'imbriquer une seconde requete dans la boucle while, ça je suis d'accord, ce qui donnera 8 requete aulieu d'une seule avec une jointure, mais niveau performance à haute demande...ne vaut mieux t'il pas utiliser la jointure justement ? A moins que la jointure fasse "comme si il y'avait 8 requete en réalité" ?
Merci de tes précisions
Edit: moi je sais faire quelque chose du genre (en schématisant à 90%) :
$req1 = select catégorie principale;
while ($req1) {
echo $catégorieprincipale;
$req2 = select sous cat where id_parent .... ;
while($req2) {
echo $affichagesouscat;
}
}
Donc cela revient au meme ?! (sur la théorie bien sur, mais en pratique sur les perfs ?)
) cela revient au même d'imbriquer une seconde requete dans la boucle while, ça je suis d'accord, ce qui donnera 8 requete aulieu d'une seule avec une jointure, mais niveau performance à haute demande...ne vaut mieux t'il pas utiliser la jointure justement ? A moins que la jointure fasse "comme si il y'avait 8 requete en réalité" ?Merci de tes précisions
Edit: moi je sais faire quelque chose du genre (en schématisant à 90%) :
Citation :
$req1 = select catégorie principale;
while ($req1) {
echo $catégorieprincipale;
$req2 = select sous cat where id_parent .... ;
while($req2) {
echo $affichagesouscat;
}
}
Donc cela revient au meme ?! (sur la théorie bien sur, mais en pratique sur les perfs ?)
Sur la théorie, c'est exactement ça. Mais c'est effectivement très mauvais au niveau des performances (trop de requêtes est mauvais pour la santé du serveur).
Mais lorsque je dis d'expliciter les jointures, je pensais plutôt à écrire:
SELECT a.bla, a.ble, b.bli FROM a JOIN b ON (b.zz=a.zz) WHERE a.actif=1
à la place de :
SELECT a.bla, a.ble, b.bli FROM a, b WHERE b.zz=a.zz AND a.actif=1
Les conditions de recherches et de jointure sont plus parlantes ainsi.
Mais lorsque je dis d'expliciter les jointures, je pensais plutôt à écrire:
SELECT a.bla, a.ble, b.bli FROM a JOIN b ON (b.zz=a.zz) WHERE a.actif=1
à la place de :
SELECT a.bla, a.ble, b.bli FROM a, b WHERE b.zz=a.zz AND a.actif=1
Les conditions de recherches et de jointure sont plus parlantes ainsi.
Lassé par la pub ? Créez un compte