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 :

Difficulté à la conception de tables


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 27
    Points : 4
    Points
    4
    Par défaut Difficulté à la conception de tables
    Bonjour,

    Je suis en train de concevoir un nouveau site web.
    Et j'essaye de mettre autant de critère que je veux sur un produit pour ensuite lors de l'affichage que le client puisse trier comme il le souhaite.
    Actuellement j'ai deux tables et un champs ID lié à la table "produit"
    Mais cette table est spéficique au critère "collection", et j'en ai une autre spécifique à "matière".
    Ce qui me semble totalement obsolète.

    Maintenant j'aimerais rajouter autant de critère que je veux à un produit sans faire de nouvelles tables, ou ajouter un champs à ma table "produit".
    Et c'est là que je pose ma question comment faire ?
    J'arrete pas d'y réfléchir mais je ne trouve pas la meilleure construction possible.

    Je pensais à ça :
    Table "options"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ID (int) 11 auto_increment,
    Name (varchar) 64,
    Language (int) 11
    Name qui vaudra par exemple : collection, matière, avec tiroirs, sans tiroirs, etc.

    Table "options_to_products"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ID (int) 11 auto_increment [lié à l'ID options]
    products_id (int) 11 (lié à ma table produits)
    language (int) 11
    options_name (varchar) 128
    options_image (varchar) 64 [Pour illustrer au cas ou]
    Options name qui vaudra : collection cookie, matière teck, 2 tiroirs, sans tiroirs, etc. etc.

    J'aimerais dans la conception ne pas ajouter de nouveaux champs à ma table produits pour lier les options.
    J'ai un champ language qui correspond à la langue et un champ products_id lié au produit donc.

    Si vous pouviez me donner vos avis, ça serait apprécier, je patauge un peu à vrai dire.
    Après pour le code, je me débrouillerai.

    Cordialement

  2. #2
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut
    Si ça peut te donner des idées, voila comment je gererai ce lien ( si toutefois j'ai bien compris ta question) :

    Si je comprend bien, tu veux rajouter autants de criteres que tu veux à un produits. Ce que je ferai, c'est rajouter une table de lien qui contiendrai l'id_produit et l'id_critere .

    est ce que ce que je te propose est faisable avec ton shéma ?


  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 27
    Points : 4
    Points
    4
    Par défaut
    est ce que ce que je te propose est faisable avec ton shéma ?
    Largement.

    Mais ça voudrait dire qu'il me faudrait trois tables à ce moment là ?
    Parce qu'on soit d'accord (c'est vrai que je suis pas clair mais c'est difficile de l'expliquer simplement), il me faut le nom du critère et sa valeur.
    le nom dans une table et la valeur dans une autre.
    Faut que se soit totalement indépendant.

    Donc mettre l'ID produit dans la table "options_to_products" c'est pas plus simple ?
    Sinon je vais me retrouver à devoir appeller X tables pour me retourner les résultats.

  4. #4
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut
    ta solution fonctionnera tres bien je pense.
    c'est toi qui sais les requêtes que tu as a faire donc tu dois savoir sur quels champs porteront tes requêtes.

    Ma solution est peut être plus generaliste car en faisant trois tables tu peux savoir qui est rattaché à quoi rien qu'en regardant la table de lien.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 27
    Points : 4
    Points
    4
    Par défaut
    Non, mais en réalité tu as raison.
    Parce que avec cette structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ID (int) 11 AUTO_INCREMENT
    products_id (int) 11
    language (int) 11
    options_name (varchar) 128
    options_image (varchar) 64
    Je vais surement finir par avoir des doublons dans ma table.
    C'est plus logique d'avoir une autre table de liaison donc.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 27
    Points : 4
    Points
    4
    Par défaut
    Alors je montre le code au final que j'ai :
    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
     
    CREATE TABLE `options` (
      `options_id` int(11) NOT NULL auto_increment,
      `options_name` varchar(64) NOT NULL,
      `language_id` int(11) NOT NULL default '1',
      PRIMARY KEY  (`options_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
     
    CREATE TABLE `options_values` (
      `values_id` int(11) NOT NULL auto_increment,
      `options_id` int(11) NOT NULL,
      `values_name` varchar(64) NOT NULL,
      `language_id` int(11) default '1',
      PRIMARY KEY  (`values_id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1;
     
    CREATE TABLE `options_to_products` (
      `products_id` int(11) NOT NULL default '0',
      `values_id` int(11) NOT NULL default '0',
      PRIMARY KEY  (`products_id`,`values_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    J'arrive à correctement retourner la valeur et le nom de l'option quand je suis sur ma fiche produit.

    Par contre, c'est là que ça se complique, au niveau du listing produit c'est la cata !
    Impossible de récupérer correctement les données et de faire un tri dynamique en suite. C'est trop chaud !

    Mon listing produit s'affiche correctemement.
    Mais je voudrais afficher correctement les options de tri et si possible avec un test pour voir si les produits dans la liste appartiennent bien à ce tri.

    Vous feriez comment vous ?

  7. #7
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut
    peut tu mettres un exemples de ce que tu as dans tes tables au depart, et ce que tu veux a l'arrivée ?

    ça serai plus facile car je ne suis pas sur de comprendre exactement ce que tu veux

    merci

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 27
    Points : 4
    Points
    4
    Par défaut
    Dans la table options :
    Matière
    -----------
    Forme du plateau

    Dans la table options_values :
    Teck
    Acajou
    Acacia
    Chataignier
    Sapin
    ------------
    Carrée
    Rectangulaire
    Ovale

    Et j'ai donc la liaison entre mes produits et les options dans options_to_products.
    Je galère trop. Aucun problème pour afficher dans la fiche produit avec l'id via une sorte de jointure entre les trois tables.
    Mais alors sur le listing impossible de faire ce que je veux.
    J'arrive à faire ça actuellement (Après disons 3H de boulot avec l'interface de l'administration ) :


    Mais je voudrais maintenant afficher uniquement les critères pour les produits listés ! et ensuite faire mon tri sur ma requete ... Aie aie !

    Merci pour tes réponses en tout cas.
    ça m'a bien aidé ... peut-etre que je verrais plus clair demain ... et j'espere !

  9. #9
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut
    Si je comprend bien:
    Pour un produit donné en paramètre, tu cherches à récupérer tous les critères (tous les values_id) qui lui son rattachés. Et ensuite tu veus sans doutes les trier mais selon quoi ?

    Donne des données brut pour qu'on comprenne bien ton résultat.

    Table OPTIONS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     ------------------------------------------
    | options_id | options_name  | language_id  |
     ------------------------------------------
    |      ?     |        ?      |      ?       |
    |      ?     |        ?      |      ?       |
    |      ?     |        ?      |      ?       |
     -------------------------------------------
    Table OPTIONS_VALUES
    idem

    Table OPTIONS_TO_PRODUCTS
    idem



  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 27
    Points : 4
    Points
    4
    Par défaut
    Table options
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      ------------------------------------------
    | options_id | options_name  | language_id  |
     ------------------------------------------
    |    1   |    Collection         |      1      |
    |    2   |   Matière   |      1     |
    |    3   |  Forme du plateau |      1      |
     -------------------------------------------
    Table options_values
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     ---------------------------------------------------
    | values_id | options_id  | values_name| language_id  |
     ---------------------------------------------------
    |     1    |       2     |      Teck      |        1      |
    |     2    |       2     |    Acajou     |        1      |
    |     3    |       2     |    Merisier    |        1      |
    |     4    |       2     |   Camélia     |        1      |
    |     5    |       2     |    Acacia     |        1      |
    ....... etc etc .....
    |    17   |       1     |     Kyoto      |        1      |
    |    18   |       1     |     Makasi     |        1      |
     ----------------------------------------------------
    Table options_to_products
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     -------------------------
    | products_id | values_id  |
     -------------------------
    |     62       |       2      |
    |     68       |       4      |
    |     68       |       20    |
    |     166     |       2      |
    |     149     |       4      |
    |    474      |       6      |
    .... etc ... etc ...
     ------------------------
    C'est pour ça que je m'interrogeais sur la pertinence de la construction des tables. Faut que ce ça soit super simple pour que je retourne mes résultats simplement.
    Y a juste le problème du listing produit avec tri dynamique qui me pose problème mais je dois avouer qie ça vole haut, très haut au vue de mes compétences.

  11. #11
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut
    je t'embete encore une derniere fois avant de chercher la requete mais tu peux me donner le resultat que tu souhaite avoir avec ta requete?

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 27
    Points : 4
    Points
    4
    Par défaut
    Alors je vais récapituler.
    Dans ma fiche produit, j'obtiens ceci :

    C'est parfait.

    Dans mes rubriques, lors du listing produit, j'obtiens cela :


    J'arrive à construire mes selects à la perfection mais j'aimerais :
    1 - qu'il ne s'affiche uniquement si les values sont attribués au produit
    car tu m'avoueras que c'est totalement inutile d'afficher une liste de tri si aucun produit n'est concerné.
    2 - Faire le tri ... et là c'est archi dur !
    Car j'arrive pas à récupérer les nom des selects en get.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <select name="filter' . $filter['options_id'] . '">

  13. #13
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut
    En espérant que je commence un peu a comprendre. Un produit n'a t'il pas forcement une matiere, une collection, et une forme au minimum.

    Car dans ce cas la j'aurai plutôt vu trois tables distinctes MATIERE, FORME et COLLECTION non ?

    Sinon, si j'ai mal compris, pour repondre à la question 1:
    je pense qu'avant d'afficher tes select, tu pourrai faire un test d'existence de tes values pour le produit souhaité en faisant pour ta value:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT count(*)
    INTO une variable
    FROM  OPTIONS_TO_PRODUCT
    WHERE values_id = ' ton id_value' AND product_id = 'ton id_product'
    si ta variable n'est pas nulle alors c'est que ton produit existe avec ce critere (hésite pas à me dire si j'ai rien compris au fonctionnement ^^ car je suis pas sur que je fais ce que tu veux)

    pour la question 2 c'est pas une question orientée php ça ?

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 27
    Points : 4
    Points
    4
    Par défaut
    Car dans ce cas la j'aurai plutôt vu trois tables distinctes MATIERE, FORME et COLLECTION non ?
    Au début j'avais quatre tables : 2 pour matière, 2 pour collection.
    2 pages pour gérer le machin dans l'administration.

    J'essaye de faire quelque chose de plus souple, plus pratique que je puisse tout gérer sur une seule page !
    Voila pourquoi je voulais remanier les tables.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT count(*)
    INTO une variable
    FROM  OPTIONS_TO_PRODUCT
    WHERE values_id = ' ton id_value' AND product_id = 'ton id_product'
    Ouais c'est ça que je voulais faire, mais ça m'embete car j'ai déjà X requetes inutiles, ça pompe un max ce genre de truc.

    En plus, c'est une liste donc c'est pas plutot ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT count(*) AS total 
    FROM  OPTIONS_TO_PRODUCT 
    WHERE values_id = ' ton id_value' AND product_id IN ('ton id_product', 'ton id_product')
    pour la question 2 c'est pas une question orientée php ça ?
    C'est vrai !
    Mais c'est dans la continuité du projet aussi.
    Si un modo me demande de séparer les choses, je le ferais !

    J'y suis presque, argh !

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 27
    Points : 4
    Points
    4
    Par défaut
    Ok, ça va presque mieux.
    Maintenant j'arrive à afficher mes listes de tri selon les produits.
    voici un échantillon du code que j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      $Q = mysql_query($listing_sql);
      $array = array();
      while ($r = mysql_fetch_array($Q)) {
        $array[] = $r['products_id'];
      }
     
      if (sizeof($array) > 1) {
        $Qfilter = mysql_query("
    select distinct o.options_id, o.options_name 
    from " . TABLE_OPTIONS . " o 
    left join " . TABLE_OPTIONS_VALUES . " ov using (options_id) 
    inner join " . TABLE_OPTIONS_TO_PRODUCTS . " o2p using (values_id) 
    where o.language_id = '" . (int)$language->getID() . "' and ov.language_id = '" . (int)$language->getID() . "' and o2p.products_id IN (" . implode(', ', $array) . ")");
    Il me reste à utiliser ces put*** de menu maintenant.
    J'arrive pas à récuperer leurs valeurs, c'est le comble !

    Allez, encore un coup de main, et je vous embete plus

  16. #16
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 27
    Points : 4
    Points
    4
    Par défaut
    En fait, au lieu de faire un select, j'ai fait des checkbox.
    Avec un nom unique sous forme de tableau : filter[].

    J'arrive à récupérer mes données maintenant.

  17. #17
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 27
    Points : 4
    Points
    4
    Par défaut
    J'ai encore un problème au niveau de ma requete.
    Quand je choisis plusieurs filtres, par exemple, matière teck et forme du plateau ovale ça me selectionne tous les produits correspondant à ces deux critères.
    ça devrait normalement me retourner les produits en matière teck et forme du plateau ovale.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $listing_sql = "select distinct " . $column . " 
                       from products p inner join products pd on (p.products_id = pd.products_id and pd.language_id = '" . (int)$language->getID() . "') 
                       inner join products_to_categories p2c on (pd.products_id = p2c.products_id) 
                       inner join options_to_products o2p on (p2c.products_id = o2p.products_id and p2c.categories_id = '" . (int)$category_id . "') 
                       where o2p.products_id IN (" . implode(', ', $_SESSION['listing_data']) . ")";
    $_SESSION['listing_data'] contient mon $_POST['filter']

    je m'arrache les cheveux !

  18. #18
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut
    Est ce que tu arrives à savoir les produites qui sont affichées ?

    Parce qu'il faut que tu fasse ta requete avec une jointure uniquement sur les produits qui sont sur ta page

  19. #19
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Joignez votre MCD,
    on verra plus clair dans la structure que vous avez faite.

    Je m'interroge sur la necessité du id_language dans 2 tables ??
    Ne ferait elle pas doublon ?

    Bon courage
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  20. #20
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 27
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par pop_up
    Est ce que tu arrives à savoir les produites qui sont affichées ?

    Parce qu'il faut que tu fasse ta requete avec une jointure uniquement sur les produits qui sont sur ta page
    Bah non, je récupères les produits via cette même requete.
    Par contre je peux faire une sous-requete dans le IN ?

    Normalement je pensais faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    foreach ($_SESSION['listing_data'] as $values_id) {
      $listing_sql .= "and values_id = '" . (int)$values_id . "'";
    }
    mais ça fonctionne pas (Pas au niveau du code, tout est bon, mais à l'affichage ça m'affiche rien)

    J'arrive pas à faire mon plan via DBdesigner, ça fonctionne pas.
    Voir les tables plus haut, si ça peut suffire ?

Discussions similaires

  1. Réponses: 8
    Dernier message: 31/05/2006, 14h21
  2. [conception] relations tables appliquée à l'archéologie
    Par Leehan dans le forum Modélisation
    Réponses: 8
    Dernier message: 08/11/2005, 20h10
  3. [Conception] gestion tables temporaires bd ?
    Par Pwill dans le forum Général Java
    Réponses: 12
    Dernier message: 08/07/2005, 14h49
  4. Un peu de philo - conception de tables pr gestion de prêts
    Par mariobedard dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 04/02/2005, 22h26
  5. Problème de conceptions de tables
    Par dtavan dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/05/2004, 23h13

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