IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Requêtes avec liaison sur la même table


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Requêtes avec liaison sur la même table
    Voici, j'aimerais construire un menu dynamique php/mysql.
    J'y suis presque parvenu, mais ce n'est pas exactement ce que je souhaite.

    Voici à quoi ressemble la table 'categories' de ma base de données mysql :

    +. catid .+ parentid +.....nom....+...url..+
    +-------+---------+-----------+------+
    + ..18 .. + ... 0 ... +...Animaux..+...url..+
    + ..51 .. + ... 0 ... +....Plantes..+...url..+
    + ..25 .. + ... 0 ... +.....Outils...+...url..+
    + ..71 .. + .. 51 .. +.....Roses...+...url..+
    + ..40 .. + ... 0 ... + Brevages...+...url..+
    + ..35 .. + .. 40 .. +.....Jus.......+...url..+
    + ..11 .. + .. 18 .. +...Oiseaux...+...url..+
    + ..95 .. + .. 18 .. +...Chiens....+...url..+
    + ..14 .. + .. 18 .. +....Chats....+...url..+
    + .. 17.. + .. 95... +...Vaccins...+...url..+
    + ..44 .. + .. 35... +....Sucré.....+...url..+
    + ..74 .. + .. 35... +.non-Sucré..+...url..+
    +-------+----------+----------+------+

    Tous les items de la colonne catid ayant un parentid = à 0 dans la colonne voisine sont les items principaux au premier niveau de mon menu.

    Items menu premier niveau
    Catid 18 Nom Animaux ............(parentid = 0) // donc premier niveau
    Catid 51 Nom Plantes ..............(parentid = 0) // donc premier niveau
    Catid 25 Nom Outils ................(parentid = 0) // donc premier niveau
    Catid 40 Nom Brevages ............(parentid = 0) // donc premier niveau


    Puis tous les autres constituent les sous-items de mon menu ainsi que les sous-sous-items sous-adjacent.

    En fait, j’aimerais que mon menu ne soit pas vraiment limité à un nombre précis de niveau. Bien qu’en pratique il y ait peu de chance que plus de trois soit vraiment nécessaire.

    Items sous-menu et sous-sous-menu
    Catid 18 nom Animaux ..................................// premier niveau
    Catid 11 --- Parentid 18 nom Oiseaux ............... // second niveau
    Catid 95 --- Parentid 18 nom Chiens ............... // second niveau
    Catid 17 --------- Parentid 95 nom Vaccins ........ // troisième niveau (sous menu de Chiens)
    Catid 14 --- Parentid 18 nom Chats ................ // second niveau
    Catid 51 nom Plantes .................................... // premier niveau
    Catid 74 --- Parentid 51 nom Roses ............... // second niveau
    Catid 25 nom Outils ........................................ // premier niveau
    Catid 40 nom Brevages ................................ // premier niveau
    Catid 35 --- Parentid 40 nom Jus ...................... // second niveau
    Catid 44 --------- Parentid 35 nom sucré ........ // troisième niveau (sous menu de Jus)
    Catid 74 --------- Parentid 35 nom non-sucré ...... // troisième niveau (sous menu de Jus)

    Si je tentes de verbaliser ceci:
    Vaccins, dont le parentid est 95, est associé à la branche Chiens via le Catid 95 de Chiens.
    Puis Chiens, Chats et Oiseaux dont les parentid sont 18 sont donc associés à la branche Catid 18, qui elle en haut lieu appartient à la branche Animaux. Simple!

    If catid = 0 // donc items premier niveau menu
    If parentid = catid // donc items sous-menu


    Et qui devrait éventuellement donner ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <ul>
      <li>Animaux
      <ul>
         <li>Oiseaux</li>
         <li>Chiens</li>
        <ul>
          <li>Vaccins</li>
    	</ul>
        <li>Chats</li>
    	</ul>
        <li>Plantes
          <ul>
            <li>Roses</li>
          </ul>
        </li>
      <li>Outils</li>
      <li>Brevages
        <ul>
          <li>Jus
            <ul>
              <li>sucré</li>
              <li>non-sucré</li>                       
            </ul>
          </li>
        </ul>
      </li>
    </ul>
    Ceci est ma première requête mysql pour le déterminer le premier niveau de mon menu qui fonctionne bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $getcategories = $DB->query("SELECT catid, nom, url FROM categories WHERE parentid = '0');
    Et ceci est ma deuxième requête pour construire les items du sous-menu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $getsubcategories = $DB->query("SELECT catid, nom, url FROM categories WHERE parentid = catid");
    Mais ca ne fonctionne pas du tout. Et puis je ne sais pas comment construire correctement la boucle qui ira chercher automatiquement tout les items du sous-menus ou du sous-sous-menus ou sous-sous-sous-menus (etc.) s’ils existent.

    Bien sûr toutes ces données ne sont pas statiques, mais dynamiques. En d'autres mots, à mesure que les tables sont mises à jour, le menu étant dynamique s'adapte. Et ce, que j'élimine, rajoute, modifie, associe, dissocie ou réarrange les items.
    Je possède cette partie du script, mais je n'arrive pas à mettre au point cette satanée requête mysql/php.

    Je comprend que tous se passe entre les données des colonnes voisines catid et parentid, mais je suis devant l'évidence que je n'ai pas les facultés intellectuelles pour résoudre cette enigme.
    Très dévalorisant comme problème je vous assure.
    Et puis tant que personne ne m'aura fournie la solution pratique, vous serez pas mieux que moi à mes yeux.

    Embêtant n’est-ce pas ?

  2. #2
    Membre expérimenté
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Points : 1 351
    Points
    1 351
    Par défaut
    Hello,

    j'ai un peu de mal à comprendre la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $getsubcategories = $DB->query("SELECT catid, nom, url FROM categories WHERE parentid = catid);
    J'imagine qu'elle n'est pas écrite comme ça dans le code si ? Avec absence de guillemet fermant ? Sans utilisation de variable $parentid ? Quelle est la requête SQL pure(sans code) envoyée au serveur ?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Adjanakis
    Hello,

    j'ai un peu de mal à comprendre la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $getsubcategories = $DB->query("SELECT catid, nom, url FROM categories WHERE parentid = catid);
    J'imagine qu'elle n'est pas écrite comme ça dans le code si ? Avec absence de guillemet fermant ? Sans utilisation de variable $parentid ? Quelle est la requête SQL pure(sans code) envoyée au serveur ?
    Salut!
    je sais que ce n'est pas facile à comprendre.
    Je m'y perd également.
    Ça fait 2 semaines que j'ai ça dans la tête.
    Un vrai zombie en ce moment je t'assure.
    La thérapie est proche.
    Excuse moi. Erreur de frappe. Il y a bien un guillemet fermant.

    J'ai presque tout essayé avec variables $parentid, $catid, mais ce n'est pas simplement au niveau de la requête mysql que ça bloque. J'arrive à extraire les items et à les classer par groupe parent. Ex: Animaux, Oiseaux, Chats, Chiens, Vaccins. mais comment faire pour Vaccins soit parent de Chiens et que Oiseaux, Chiens et Chats soient parent de Animaux?

    Ce code est ce qui en principe construit les items du sous-menu. mais avec ça impossible de descendre à un 3e niveau. Je ne veux pas être limité en terme de nombre 'sous' niveau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    function DisplaySubCats($parentid, $delimiter, $padstring, $fullpadstring)
    {
    	global $DB; //db connection
     
        // display categorys subcategories
        $getsubcategories = $DB->query("SELECT catid, nom, url FROM categories WHERE parentid = '" . $parentid . "'");
     
        if($subcategoryrows = $DB->get_num_rows($getsubcategories))
        {
          while($subcategory = $DB->fetch_array($getsubcategories))
          {
            if(strlen($subcategory['url']) > 0)
              echo '<ul><li>' . $fullpadstring . $delimiter . '<a href="' . $subcategory['url'] . '">' . $subcategory['nom'] . '</a></li></ul></li>';
            else
              echo '<li>' . $fullpadstring . $delimiter . '<a href="index.php?catid=' . $subcategory['catid'] . '">' . $subcategory['nom'] . '</a></li>';
     
    DisplaySubCats($subcategory['catid'], $delimiter, $padstring, $fullpadstring . $padstring);
          } 
    	  echo '</ul></li>';
        } 
    }
    Et puis les tags HTML <ul><li>....loin d'être résolu.
    J'ai besoin de if/else pour tester s'il existe des sous-menus à chaque items trouvés et de contruire le menu en conséquence avec des <ul><li>.
    Ouf!!!!

    $delimiter, $padstring, $fullpadstring . $padstring ne sont que des tirets ou caractères à afficher à côté des items. Sans importances.
    Merci de t'avoir attardé à ce problème.
    Ça m'encourage.

  4. #4
    Membre averti Avatar de mLk92
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    527
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 527
    Points : 305
    Points
    305
    Par défaut
    Hi !!

    Alors déja tu dois ouvrir et fermer les balises HTML de liste comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <ul> <li> ... </li> </ul>
    dans ton code tu la ferme comme cela : </ul></li>

    Et est-ce que tes champs catid et parentid sont dans la meme table ? et/ou de la meme table que nom ? que url ?

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par mLk92
    Hi !!

    Alors déja tu dois ouvrir et fermer les balises HTML de liste comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <ul> <li> ... </li> </ul>
    dans ton code tu la ferme comme cela : </ul></li>

    Et est-ce que tes champs catid et parentid sont dans la meme table ? et/ou de la meme table que nom ? que url ?
    Salut
    Ouais. Ça le HTML ca va. Je sais bien qu'il faut ouvrire et fermer les balises.
    Mais il faut qu'il soit généré dynamiquement en fonction de ma requête mysql. Mais puisque je n'ai pas encore la requête mysql je ne peux pas construire le HTML présentement. Je sais ce que ca donnera probablement et j'y arriverai surement à la dure. Disont que je me concentre sur la requête mysql pour l'instant. Trop complexe pour moi ça.

    Oui tout est dans une seule et même table.
    La table se nomme categories.
    Elle est composée de 4 colonnes (catid, parentid, nom, url)

  6. #6
    Expert confirmé
    Avatar de debug
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    1 034
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 034
    Points : 4 093
    Points
    4 093
    Par défaut
    Je ne comprends pas ton problème là.

    La requête est la même que ce soit une rubrique ou une sous rubrique.

    Le code php que tu fournis le fait très bien à mon avis, puisque que tu utilises:
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    DisplaySubCats($subcategory['catid'], $delimiter, $padstring, $fullpadstring . $padstring);
    Cela fait un appel récursif de ta fonction... Tu es sur que ton problème ne vient pas de ton rendu HTML qui t'induirais en erreur ??

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Ajoutez à ce thread-ci la 10 0001 réponses à une question sur ce forum
    Citation Envoyé par debug
    Je ne comprends pas ton problème là.

    La requête est la même que ce soit une rubrique ou une sous rubrique.

    Le code php que tu fournis le fait très bien à mon avis, puisque que tu utilises:
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    DisplaySubCats($subcategory['catid'], $delimiter, $padstring, $fullpadstring . $padstring);
    Tu es sur que ton problème ne vient pas de ton rendu HTML qui t'induirais en erreur ??
    Peut-être que tu as raison, mais puisque je suis incapable de générer le HTML correctement alors j'ai pensé que c'était la requête la source de mon problème.

    Comment je fais alors pour disposer le tout proprement? Si cette requête devrait le faire alors ce sont mes <ul></ul><li></li> qui ne sont pas bien situés dans ma boucle IF/WHILE du code ci-dessous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    FUNCTION DisplaySubCats($parentid, $delimiter, $padstring, $fullpadstring)
    {
    	global $DB; //db connection
     
        // display categorys subcategories
        $getsubcategories = $DB->query("SELECT catid, nom, url FROM categories WHERE parentid = '" . $parentid . "'");
     
        IF($subcategoryrows = $DB->get_num_rows($getsubcategories))
        {
          while($subcategory = $DB->fetch_array($getsubcategories))
          {
            IF(strlen($subcategory['url']) > 0)
              echo '<ul><li>' . $fullpadstring . $delimiter . '<a href="' . $subcategory['url'] . '">' . $subcategory['nom'] . '</a></li></ul></li>';
            else
              echo '<li>' . $fullpadstring . $delimiter . '<a href="index.php?catid=' . $subcategory['catid'] . '">' . $subcategory['nom'] . '</a></li>';
     
    DisplaySubCats($subcategory['catid'], $delimiter, $padstring, $fullpadstring . $padstring);
          } 
    	  echo '</ul></li>';
        } 
    }
    D'après moi je ne suis pas très loin de la solution. C'est une question d'assemblage adéquat de la fonction probablement. En ce moment j'arrive à faire un menu à 2 niveau. Par contre dès que je tente d'en ajouter un 3e en placant un item de sorte qu'il soit parent d'un item de 2e niveau (comme Vaccins dans mon exemple), ca ne marche plus. Le code HTML généré n'est pas correct. J'aurais besoin d'ajouter un IF/ELSE pour tester s'il existe un sous menu, puis d'afficher tels codes HTML, sinon d'afficher un autre code HTML. Mais je m'y perd totalement.

    Il doit certainement exister une façon en PHP de ne pas être limité à un nombre de sous-menu.

  8. #8
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    Bonjour,

    Tu devrais trouver ton bonheur ici :
    http://sql.developpez.com/arborescence/

  9. #9
    Membre averti Avatar de mLk92
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    527
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 527
    Points : 305
    Points
    305
    Par défaut
    Désolé de revenir la dessus, mais je pense qu'il y a une erreur au niveau du hmtl :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
           IF(strlen($subcategory['url']) > 0)
              echo '<ul><li>' . $fullpadstring . $delimiter . '<a href="' . $subcategory['url'] . '">' . $subcategory['nom'] . '</a></li></ul></li>';
            else
              echo '<li>' . $fullpadstring . $delimiter . '<a href="index.php?catid=' . $subcategory['catid'] . '">' . $subcategory['nom'] . '</a></li>';
    		
    DisplaySubCats($subcategory['catid'], $delimiter, $padstring, $fullpadstring . $padstring);
          } 
    	  echo '</ul></li>';
        } 
    }
    voila le code hmtl que tu crée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <ul>
         <li><a></a></li>
    </ul>
    </li>
    <li><a></a></li>
    </ul></li>
    Le code html est mal généré, je ne sais pas si t'arrive à avoir un menu de type liste, mais je pense qu'il faudrai modifié ça
    Essai çà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
           IF(strlen($subcategory['url']) > 0)
              echo '<ul><li>' . $fullpadstring . $delimiter . '<a href="' . $subcategory['url'] . '">' . $subcategory['nom'] . '</a></li></ul><ul>';
            else
              echo '<li>' . $fullpadstring . $delimiter . '<a href="index.php?catid=' . $subcategory['catid'] . '">' . $subcategory['nom'] . '</a></li>';
    		
    DisplaySubCats($subcategory['catid'], $delimiter, $padstring, $fullpadstring . $padstring);
          } 
    	  echo '</ul>';
        } 
    }
    Je ne sais pas si c'est exactement ce que tu veux mais peut être que ça aidera

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par jeca
    Bonjour,

    Tu devrais trouver ton bonheur ici :
    http://sql.developpez.com/arborescence/
    MERCI! MERCI! MERCI!
    C'est en plein ce qu'il me fallait.

    Je comprends maintenant.

    Rien de mieux qu'un tuto bien fait.

    Aurevoir.

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par mLk92
    Je ne sais pas si c'est exactement ce que tu veux mais peut être que ça aidera
    Merci pour le temps mit la-dessus!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] SELECT * avec jointure sur une même table
    Par Oprichnik dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 09/03/2011, 14h17
  2. Requete avec jointure sur la même table
    Par CaptainChoc dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/04/2009, 13h30
  3. UPDATE avec SELECT sur la même table
    Par Invité dans le forum Langage SQL
    Réponses: 7
    Dernier message: 07/12/2007, 04h39
  4. [MySQL] requête avec jointure sur la même table
    Par gwena54 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 08/05/2007, 12h22
  5. créer TRIGGER sur 1 table avec liaison sur 2 autre table
    Par shaka84 dans le forum Développement
    Réponses: 2
    Dernier message: 11/04/2006, 12h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo