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

PHP & Base de données Discussion :

requete extraire catégorie enfant par rapport aux parents


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 187
    Par défaut requete extraire catégorie enfant par rapport aux parents
    bonjour,
    je voudrais savoir si avec une simple requete (pourquoi pas avec des sous requet ou autre) je peux extraire mes catégorie parent et enfant comme ci :
    c.a.d : afficher mes catégorie parent et en dessous de chaque catégorie parent, afficher leurs catégories enfants
    comme ceci :
    cat parent3
    cat enfant1 de parent3
    cat enfant2 de parent3

    cat parent2
    cat parent1
    voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    $reponse = $bdd->query("SELECT *,
    ") or die(print_r($bdd->errorInfo())); //requete ??????????
     
    while ($donnees = $reponse->fetch())
    {
    	echo'<p>$donnees['nomCategorieProduits']</p>';
    }
    ?>
    voici ma table :
    Code sql : 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
    CREATE TABLE IF NOT EXISTS `categorie_produits` (
      `idCategorieProduits` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
      `nomCategorieProduits` varchar(100) NOT NULL,
      `parentCategorieProduits` mediumint(8) unsigned NOT NULL,
      `descriptionCategorieProduits` text NOT NULL,
      `imageCategorieProduits` varchar(10) NOT NULL,
      `dateModifCategorieProduits` datetime NOT NULL,
      `dateCreationCategorieProduits` datetime NOT NULL,
      `ordreCategorieProduits` mediumint(9) NOT NULL,
      `metaTitreCategorieProduits` varchar(130) NOT NULL,
      `metaDescriptionCategorieProduits` varchar(150) NOT NULL,
      `publierCategorieProduits` tinyint(1) NOT NULL,
      `corbeilleCategorieProduits` tinyint(1) NOT NULL,
      PRIMARY KEY (`idCategorieProduits`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=56 ;
     
    --
    -- Contenu de la table `categorie_produits`
    --
     
    INSERT INTO `categorie_produits` (`idCategorieProduits`, `nomCategorieProduits`, `parentCategorieProduits`, `descriptionCategorieProduits`, `imageCategorieProduits`, `dateModifCategorieProduits`, `dateCreationCategorieProduits`, `ordreCategorieProduits`, `metaTitreCategorieProduits`, `metaDescriptionCategorieProduits`, `publierCategorieProduits`, `corbeilleCategorieProduits`) VALUES
    (51, 'cat parent1', 0, '', '', '2012-12-11 17:40:21', '2012-12-11 17:40:21', 3, '', '', 1, 0),
    (54, 'cat enfant1 de parent3', 53, '', '', '2012-12-11 17:42:03', '2012-12-11 17:42:03', 2, '', '', 1, 0),
    (55, 'cat enfant2 de parent3', 53, '', '', '2012-12-11 17:42:29', '2012-12-11 17:42:21', 1, '', '', 1, 0),
    (52, 'cat parent2', 0, '', '', '2012-12-11 17:41:12', '2012-12-11 17:41:12', 2, '', '', 1, 0),
    (53, 'cat parent3', 0, '', '', '2012-12-11 17:41:22', '2012-12-11 17:41:22', 1, '', '', 1, 0);

    merci

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Par défaut
    Bonsoir,

    cela relève de l'affichage donc tu doit le faire coté applicatif et non avec une requête.

  3. #3
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    Ton modèle de conception de données (Bdd) me surprend un peu, qui ne veut pas dire qu'il ne soit pas correcte.

    Là où je veux en venir, il faudrait peut être faire le point sur ton propre besoin pour qu'on puisse réellement savoir si ton modèle est correcte ou pas avant qu'on avance quoi que ce soit comme solution.

    Je disais donc que cela me surprend du fait que généralement les arborescences de plusieurs niveaux se font essentiellement sur les catégories et non un mélange de catégories/produits.
    Ce n'est que lors ou toutes l'arborescence est faite sur les catégories que c'est là ou on créer une table categories_produits afin de lier les produits à leur catégorie respective.
    En d'autre terme, la table catégories_produits ne devrait que contenir uniquement 2 champs, 2 clés étrangères : catégories et produits.


    Plus généralement on voit des modèles de données comme ceci :
    table catégorie : id_categorie | id_parent | nom |date_creation
    Toute l'arborescence donc ce fera grâce au couple id/parent, ça peu aller à l'infinie.

    Ensuite un table categories_produits afin de lier les produits (id_produit) uniquement aux catégories (id_categorie), donc :
    table catégories_produits : id_categorie | id_produit

    On ne va pas lier les produits aux catégories parente, pour la simple raison qu'une catégorie parentes est forcément liée à une catégorie, l'indiquer c'est se qu'on appel de la redondance de données, et ceci est très fortement déconseillé à faire car cela peu provoquer de grosses incohérences entre les données (ici, entre la valeur d'un id_categorie et id_parent pour chaque produits).

    Normalement l'id_categorie est unique (clé primaire), celle-ci suffit pour remonter l'arborescence pour voir si elle appartient à une catégorie parente ou pas.


    Bref, fait le point, ça ne mange pas d'pain, ça peu être utile.
    Tout cela sauf erreur bien entendu

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 187
    Par défaut
    c'est adire qu'en général, tu vois, plutot,

    une table produits
    une table jointure_produits_categories
    une table categories

    et une table pour relier les catégories entre elles?
    genre jointure_categories_categories
    qui joint les idCatégories d'une meme table la "table categories" ?
    et donc qui détermine les quelle categorie est sous catégorie de l'autre

    et dans quelle table mest tu le champ "ordreProduits"
    qui determine l'ordre du produit par rapport aux autre de la meme catégorie?

    et enfin ce que je demande dans mon premier message est'il vraiment impossible,
    car dans l'immédiat ca me ferait gagner beaucoup de temps?

    encore merci

  5. #5
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Citation Envoyé par artichaudd Voir le message
    c'est adire qu'en général, tu vois, plutot,

    une table produits
    une table jointure_produits_categories
    une table categories

    et une table pour relier les catégories entre elles?
    genre jointure_categories_categories
    qui joint les idCatégories d'une meme table la "table categories" ?
    et donc qui détermine les quelle categorie est sous catégorie de l'autre
    Oui, il me semble que tu as bien vu

    Pour être plus juste, je reprends les 3 tables en les mettant quelque part dans l'ordre :
    - categories : id_categorie |id_parent | libelle
    - categories_produits : id_categorie | id_produit
    - produits : id_produit

    En faite, cette représentation (par auto-jointure) ne respecte pas vraiment les bonnes conventions de conceptions de Bdd, si on peu dire, mais pour des raisons d'optimisations cela se fait beaucoup (Blog, CMS, etc ...).

    Après ça, si l'arbre des catégories et très profond (plus de 5 niveaux par exemple), ou encore que chaque niveaux contient beaucoup de catégories, une autre représentation encore plus optimisée peut être adoptée, c'est l'intervallaire.
    Cependant cette représentation est très complexe à mes yeux à mettre en place, donc faut voir.

    Il y a d'ailleurs un tuto qui explique la représentation intervallaire, et au tout début on y fait allusion à cette 1ère représentation (par auto-jointure).
    -> la représentation intervallaire

    J'évoque cela juste pour dire que cette problématique est connue depuis longtemps, et donc beaucoup ont réfléchi à comment faire, et des solutions existent du coup.
    Après ce n'est qu'une question de choix.


    et dans quelle table mest tu le champ "ordreProduits"
    Si tu souhaites une parfaite maitrise de l'ordre des catégories et des produits, il faut rajouter un champ "ordre" dans les 2 tables "categories" et "categories_produits".

    Il y a un détail qui peu ne pas en être un, cela dépend du besoin.
    - Si on défini (du définitif théoriquement) qu'un produit n'appartiendra qu'à 1 catégorie et une seule, alors on peu créer la table categories_produits comme ceci :
    categories_produits : id_categorie | id_produit
    Ces 2 champs formeront la clé primaire (une clé double zone).

    - Par contre, si on souhaite que certains produits (même 1 seul) puissent être liés à plusieurs catégories, alors on ne peu plus faire comme ci-dessus, il faudra faire comme ceci :
    categories_produits : id | id_categorie | id_produit
    Le champ "id" sera la clé primaire en auto_increment.
    Les 2 autres champs d'identifiants seront des clés étrangères.


    et enfin ce que je demande dans mon premier message est'il vraiment impossible,
    car dans l'immédiat ca me ferait gagner beaucoup de temps?
    Ca me parais impossible.
    Mais faut pas trop se focaliser la dessus.
    Si c'est le coté performance (genre estimer que cela fera trop de requêtes SQL), si on défini bien son besoin on peu optimiser tout ça grâce à des systèmes de cache.
    Un truc courant, c'est qu'il sera rare que les catégories soient modifiées (ajout, modif, sup), sauf au début de la mise en service su site Web.
    Donc (pour exemple) on peu mettre le code HTML d'un menu en cache, au bout on génèrera le menu sans jamais solliciter la Bdd.
    Ce cache serait réactualisé uniquement qu'en cas de modification.

    On peu aussi, pourquoi pas, stocker toute l'arborescence des catégories dans un fichier Php sous forme de tableau (ou Objet) pour après l'inclure lorsque cela est nécessaire.
    Là encore on ne sollicite pas la Bdd.

    On peu imaginer d'autres solutions encore.

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Il y a un détail qui peu ne pas en être un, cela dépend du besoin.
    - Si on défini (du définitif théoriquement) qu'un produit n'appartiendra qu'à 1 catégorie et une seule, alors on peu créer la table categories_produits comme ceci :
    categories_produits : id_categorie | id_produit
    Ces 2 champs formeront la clé primaire (une clé double zone).

    - Par contre, si on souhaite que certains produits (même 1 seul) puissent être liés à plusieurs catégories, alors on ne peu plus faire comme ci-dessus, il faudra faire comme ceci :
    categories_produits : id | id_categorie | id_produit
    Le champ "id" sera la clé primaire en auto_increment.
    Les 2 autres champs d'identifiants seront des clés étrangères.
    FAUX !
    Si un produit n'appartient qu'à une seule catégorie, on met une clé étrangère référençant la catégorie dans la table des produits. La table categorie_produit est alors inutile.

    Si un produit peut appartenir à plusieurs catégories, c'est justement là qu'il faut une table associative dont la clé primaire est le couple {id_produit, id_categorie}.

    Pour savoir quand il faut une table associative, voir mon blog.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. ordonner les parents par rapport aux dates des children
    Par fphenix dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/03/2011, 13h29
  2. Réponses: 18
    Dernier message: 08/04/2006, 10h39
  3. Frequence processeur par rapport aux autres composants
    Par black is beautiful dans le forum Composants
    Réponses: 7
    Dernier message: 02/02/2006, 19h08
  4. [CSS] Aligner le texte par rapport aux puces de listes
    Par Invité dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 20/11/2005, 10h35
  5. [Choix] Quelles attentes par rapport aux SGBD ?
    Par thierry34 dans le forum Décisions SGBD
    Réponses: 6
    Dernier message: 13/07/2002, 20h08

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