Se connecter / S'enregistrer
Votre question

Jointure cat/sous cat d'une meme table

Tags :
  • Sql
  • Programmation
Dernière réponse : dans Programmation
25 Janvier 2011 01:59:45

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 :

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_categorie


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 :fou: 

Merci beaucoup pour le petit aiguillage

Autres pages sur : jointure cat cat table

a c 145 L Programmation
25 Janvier 2011 09:15:34

Je ne vois que deux options:

Pour n'avoir que les sous-catégories (donc les catégories vides n'apparaissent pas):
  1. SELECT a.id_categorie, a.nom_categorie, b.nom_categorie AS souscat
  2. FROM categorie a, categorie b
  3. WHERE b.id_categorie = a.id_categorie


Pour avoir les sous-catégories et aussi les catégories vides:
  1. SELECT a.id_categorie, a.nom_categorie, b.nom_categorie AS souscat
  2. FROM categorie a
  3. LEFT JOIN categorie b ON (b.id_categorie = a.id_categorie)
m
0
l
25 Janvier 2011 14:49:28

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 :D ) 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 :D 
je te remercie
m
0
l
a c 145 L Programmation
25 Janvier 2011 15:15:12

En fait, tout dépend de ce que tu veux afficher.
Voici ce que je ferais très simplement:
  1. <?php
  2. $sql = "SELECT cat.id_categorie, cat.nom_categorie, scat.id_categorie AS sid, scat.nom_categorie AS sname
  3. FROM categories scat
  4. LEFT JOIN categories cat ON (scat.id_parent=cat.id_categorie)
  5. WHERE scat.id_parent > 0
  6. ORDER BY cat.id_categorie";
  7. $res = mysql_query($sql);
  8.  
  9. $cat = '';
  10. while($aff=mysql_fetch_object($res)) {
  11. if ($aff->nom_categorie != $cat) {
  12. echo '<b><a href="', $aff->id_categorie, '">', $aff->nom_categorie, '</a></b> <br />', chr(13), chr(10);
  13. $cat = $aff->nom_categorie;
  14. }
  15. echo $aff->souscat, '<br />', chr(13), chr(10);
  16. }

m
0
l
a c 232 L Programmation
25 Janvier 2011 15:17:36

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:
  1. SELECT a.id_categorie, a.nom_categorie, b.nom_categorie AS souscat
  2. FROM categorie a, categorie b
  3. WHERE a.id_categorie = b.id_parent


ou
  1. SELECT a.id_categorie, a.nom_categorie, b.nom_categorie AS souscat
  2. FROM categorie a
  3. LEFT JOIN categorie b ON (b.id_parent = a.id_categorie)



Edit: grillé :) 
m
0
l
25 Janvier 2011 16:02:22

Merci beaucoup, ca fonctionne, les jointures c'est vraiment pas mon truc ...
Merci encore
m
0
l
a c 145 L Programmation
25 Janvier 2011 16:10:15

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.
m
0
l
25 Janvier 2011 16:14:17

Donc le mieux, vu que j'ai du mal avec les jointures (ha bon ? :D ) 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 ?)
m
0
l
a c 145 L Programmation
25 Janvier 2011 17:10:09

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.
m
0
l
25 Janvier 2011 17:47:48

ah ok, donc rien à voir avec ce que je pensais :D  merci crazy
m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS