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 :

Créer des catégories et des sous-sous-catégories


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2005
    Messages : 13
    Points : 13
    Points
    13
    Par défaut Créer des catégories et des sous-sous-catégories
    Bonjour,

    Depuis longtemps je créer des catégories et des sous-catégorie en utilisant une table categorie et une table sous-categorie.

    Alors, quand je veux créer une sous-categorie j,ai une liste déroulante qui affiche les catégories disponible.

    Je fait envoyer et dans ma table sous_categorie J,ai un numéro de sous_categorie (clef primaire autoincrémenté) , un nom et un champ categorie_id.

    Maintenant, je veux pouvoir avoir des sous-sous-categorie en utilisant seulement une table.

    J'ai donc lu le tutoriel http://sqlpro.developpez.com/cours/arborescence/

    C'est en théorie exactement se que je cherches.

    Mais je n'arrive pas a mettre ça en pratique.

    Toutes les requête de se tutoriel contiennent les numéros des enregistrement pour les clauses where.

    Mais dans la pratique ont ne connait pas les numéros d'enregistrement la requête doit être plus automatique ou autonome.

    Voici se que j'ai fait de mon côté avant de lire ce tutoriel:

    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
    <table width="500" border="0" cellspacing="4" cellpadding="4">
    <?
    echo "<tr>";
    echo "<td class=\"border3\"><b>Cat&eacute;gorie:</b></td>\n";
    echo "</tr>\n";
    echo "<tr>\n";
    echo "<td>\n";
     
    $sql=mysql_query('select * from categories order by nom ASC') or die("Impossible d'ouvrir la table");
    echo "*<select name='id_cat'>\n";
    echo "<option value='0'>Choisir une sous-cat&eacute;gorie</option>\n";
    while ($row=mysql_fetch_array($sql))
    {
    echo "<option value=\"".$row["id_cat"]."\">".$row["nom"]."</option>\n";
     
    	$sql=mysql_query('select * from categories where id_parent='.$row["id_cat"].' order by nom ASC') or die("Impossible d'ouvrir la table");
    	while ($row1=mysql_fetch_array($sql))
    	{
    	echo "<option value=\"".$row1["id_cat"]."\">".$row["nom"]." -> ".$row1["nom"]."</option>\n";
    	}
    }
    echo "<br><br></td>\n";
    echo "</tr>\n";
    ?>
    </table>
    Voici ma table:

    CREATE TABLE categories (
    id_cat int(255) NOT NULL auto_increment,
    nom varchar(255) NOT NULL,
    id_parent int(255) NOT NULL,
    id_sous_parent int(255) NOT NULL,
    ord_affiche int(255) NOT NULL,
    PRIMARY KEY (id_cat)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    Pouvez-vous m'aider svp?

    Merci!!

  2. #2
    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,

    Toutes les requête de se tutoriel contiennent les numéros des enregistrement pour les clauses where.
    Non. A tel point que dans aucune des tables exemples, il n'y a d'id.

    Dans l'exemple ci-dessous (que j'utilise sur un site), j'ai ajouté un 'id' autoincrémenté.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE TABLE `test` (
      `id` tinyint(1) unsigned NOT NULL auto_increment,
      `libelle` char(25) NOT NULL default '',
      `id_pere` tinyint(1) default NULL,
      `bg` tinyint(1) NOT NULL default '0',
      `bd` tinyint(1) NOT NULL default '0',
      PRIMARY KEY  (`id`)
    )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    INSERT INTO `test` (`id`, `libelle`, `id_pere`, `bg`, `bd`) VALUES (1, 'catégorie 1', 0, 1, 2);
    INSERT INTO `test` (`id`, `libelle`, `id_pere`, `bg`, `bd`) VALUES (2, 'catégorie 2', 0, 3, 10);
    INSERT INTO `test` (`id`, `libelle`, `id_pere`, `bg`, `bd`) VALUES (3, 'catégorie 3', 0, 11, 12);
    INSERT INTO `test` (`id`, `libelle`, `id_pere`, `bg`, `bd`) VALUES (4, 'catégorie 4', 0, 13, 14);
    INSERT INTO `test` (`id`, `libelle`, `id_pere`, `bg`, `bd`) VALUES (5, 'catégorie 5', 0, 15, 22);
    INSERT INTO `test` (`id`, `libelle`, `id_pere`, `bg`, `bd`) VALUES (6, 'sous-catégorie 2-1', 2, 4, 5);
    INSERT INTO `test` (`id`, `libelle`, `id_pere`, `bg`, `bd`) VALUES (7, 'sous-catégorie 2-2', 2, 6, 7);
    INSERT INTO `test` (`id`, `libelle`, `id_pere`, `bg`, `bd`) VALUES (8, 'sous-catégorie 2-3', 2, 8, 9);
    INSERT INTO `test` (`id`, `libelle`, `id_pere`, `bg`, `bd`) VALUES (9, 'sous-catégorie 5-1', 5, 16, 17);
    INSERT INTO `test` (`id`, `libelle`, `id_pere`, `bg`, `bd`) VALUES (10, 'sous-catégorie 5-2', 5, 18, 19);
    INSERT INTO `test` (`id`, `libelle`, `id_pere`, `bg`, `bd`) VALUES (11, 'sous-catégorie 5-3', 5, 20, 21);
    Pöur récupérer les catégories :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php  
      $sql = 'select libelle, bg, bd
              from test
              where id_pere = 0'; 
    ?>
    Dans l'attribut 'value' de l'élément <option>, je mets : "valeur_bg,valeur_bd".

    Pour récupérer les sous-catégories de la catégorie sélectionné (étant sous-entendu que l'élément <select> des catégories s'appelle 'cat') :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php  
      list($bg, $bd) = explode(',', $_POST['cat']);
      $sql = 'select libelle
              from test
              where bg >' . $bg . '
              and bd < ' . $bd; 
    ?>
    Qu'y a t-il de plus simple ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2005
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    Oui le tuto est comme j'ai dit plus dans la page il y a les données:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO NEW_FAMILLE (NFM_BG, NFM_BD, NFM_LIB)       VALUES (1, 44, 'Transport')
    INSERT INTO NEW_FAMILLE (NFM_BG, NFM_BD, NFM_LIB)       VALUES (2, 21, 'Aérien')
    INSERT INTO NEW_FAMILLE (NFM_BG, NFM_BD, NFM_LIB)       VALUES (3, 4, 'Planeur')
    Voici une des requetes exemple du tuto qui ressemble a ton code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
    FROM   NEW_FAMILLE
    WHERE  NFM_BD - NFM_BG = 1
       AND NFM_BG > 22
       AND NFM_BD < 35
    À part ça merci infiniment ton code m'éclaire un peu.

    Mais une chose que je ne comprend pas c'est si plus tard de nouvelles sous-categories sont ajouté bien sont id sera la prochaine id autoincrementé de la bd, pas nécessairement un id situé entre

    where bg >' . $bg . '
    and bd < ' . $bd;
    Merci!

  4. #4
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Salut Jeca, salut tout le monde,

    Ce que je n'arrive pas à capter, c'est la construction/modification dynamique de la table...genre les inserts de cat/sous cat ou les suppressions de cat/sous-cat...voire une modif de sous-cat qui serait affectée à une autre cat...
    Comment je détermine les bg et bd ?
    Parce que le dessin du fil qui se balade dans les branches de l'arbre, okay...mais en php ?


  5. #5
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    1- Une fonction récursive serait plus souple d'utilisation mais plus gourmande en ressources dès lors que l'arbre est grand.

    2- La méthode intervallaire de SqlPro serait moins gourmande en ressources mais plus "statique" et plus adaptée à des arbres qui ne se modifient pas trop souvent.

    Ce qui me fait m'interroger sur ce point : à quoi peut bien servir un arbre statique ? Le but n'est il pas justement de pouvoir ajouter des sous-cats, en enlever, bref faire bouger l'arbre ?

    Bref on est guère plus avancé...

  6. #6
    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 Renaud,

    Comment va ?

    A propos de la récursivité, sqlpro écrit :
    C'est pourquoi ce modèle est a proscire lorsque :

    * l'arbre est profond (plus de 5 niveaux)
    * l'arbre est large (plus de 100 éléments sur un même niveau)
    * l'arbre contient beaucoup de valeurs (à partir de 200 à 300 éléments)
    * la majorité des requêtes sont des requêtes d'interrogation - SELECT (au moins 50% des requêtes)

    Et personnellement je vous conseille de passer au modèle par intervalle dès que l'un de ces 4 critères est vrai !

  7. #7
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Hello Jérôme, content de te revoir par là !

    Qu'en déduire alors ?
    Est-ce adapté pour, par exemple, un annuaire de sites web qui ne serait pas limité en sous-cats ?

    Animaux
    chats
    Persans
    Persans gris
    Persans roux
    Abyssins
    Chiens... etc

    Je vois que tu utilises l'intervallaire sur un de tes sites... c'est "malléable" ? Tu maîtrises les inserts et les updates de ce type de table ?

    Bon... à côté de ça, j'ai toujours une vie de retard sur toi en PHP et je n'en suis qu'à tenter de créer une récursive qui fonctionne bien et affiche proprement les données sous forme de tableau HTML...
    Bref pas sorti de l'auberge...Mais c'est tellement interessant...

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2005
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    J'ai fait une recherche en anglais sur google et j'ai trouvé ceci:

    http://dev.mysql.com/tech-resources/...ical-data.html

    Si j'y comprend bien, il est possible de faire une jointure sur la même table?

  9. #9
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Bonjour,

    Merci, c'est balaise...
    Je vais manger 12 aspros et je plonge dedans...
    Ensuite, je dirai ici ce que j'ai pu en tirer...

  10. #10
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Impressionnant !

    J'ai réussi à faire des inserts et des delete avec php, c'est carrément cool.
    Je bute maintenant sur la construction de l'arbre (affichage).
    Je ne parviens pas à identifier les catégories mères...que je voudrais rendre clicables afin d'afficher les sous-cat.

    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
     
            1 ELECTRONICS 1 28 
            2 TELEVISIONS 2 9 
            3 TUBE 3 4 
            4 LCD 5 6 
            5 PLASMA 7 8 
            6 PORTABLE ELECTRONICS 10 23 
            7 MP3 PLAYERS 11 14 
            8 FLASH 12 13 
            9 CD PLAYERS 15 16 
            10 2 WAY RADIOS 17 18 
            11 GAME CONSOLES 19 22 
            12 FRS 20 21 
            13 ORDINATEURS 24 27 
            14 SONY 25 26
    si on considére que la 1 est racine et que je ne la sélectionne pas, comment sélect les mères qui sont 2 - 6 -13 ?

    Z'avez une idée ?

  11. #11
    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
    Ajoute une colonne 'id_pere'

  12. #12
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    mais ça va pas nous faire retomber dans cette maudite récursivité, ça ????

  13. #13
    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
    Non.Reprend mon message du 4 à 11H45

  14. #14
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Bonjour,

    Oui j'ai bien compris ton exemple, Jeca, pas de prob, ça fonctionne. Plutôt qu'un select, j'ai mis des liens et des $_GET mais c'est ok...
    J'ai aussi essayé de comprendre les requêtes du tuto anglais (chaud devant...)...mais très bien pour les INSERT et les DELETE.
    Mais j'ai quand même vachement de mal à "descendre dans l'arbre" et faire une présentation soignée des catégories.
    Notamment, je voudrais que les sous-cats "mères" soient clicables pour afficher leurs sous-cat (en repliant le reste) et éviter un arbre énorme...mais je vois pas comment faire sans le récursif.

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

Discussions similaires

  1. Probleme lien des cellules lors des copies auto des onglets sous vba
    Par FEADEUR dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 28/06/2013, 16h38
  2. Réponses: 1
    Dernier message: 27/11/2008, 18h00
  3. Afficher des Flags ou des etoiles dans Crystal Report sous VS2005
    Par mczikas dans le forum SAP Crystal Reports
    Réponses: 0
    Dernier message: 11/08/2008, 14h51
  4. Réponses: 10
    Dernier message: 23/03/2007, 15h28
  5. Réponses: 3
    Dernier message: 23/01/2007, 08h14

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