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 :

Tri sur une requête complexe


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club Avatar de erehcab
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 215
    Points : 57
    Points
    57
    Par défaut Tri sur une requête complexe
    L'histoire se passe entre deux tables : la table node et la table produit.

    Dans la table node il y a la correspondance entre les produits et les rubriques aux quelles ils sont associés. Il y a aussi la correspondance entre les rubriques et leurs sous-rubriques.

    Une de mes rubriques s'appelle " marque ", toutes les marques de la boutique sont des sous rubriques de cette rubrique ("marque"). Les produits selon leurs marques sont donc associés à ses sous rubriques ainsi qu'a la rubrique mère.

    Ex :

    Un produit P1 (id = 1) , une rubrique R1 (id = 2) et une sous rubrique SR1 (id = 3).

    dans la table node il va donc y avoir de genre de tuple :

    1 / "produit" / 2 / "rubrique" / 0 // association du produit à la rubrique mère
    1 / "produit" / 3 / "rubrique" / 0 // association du produit à la sous rubrique
    2 / "rubrique" / 3 / "rubrique" / 0 // association de la sous rubrique à la rubrique mère

    Le produit peut aussi être associé à d'autre rubriques différentes de " marque ", pouvant contenir aussi des sous rubriques.

    Ex ( en plus des tuples précédent) :

    1 / "produit" / 4 / "rubrique" / 0 // association du produit à la rubrique mère
    1 / "produit" / 5 / "rubrique" / 0 // association du produit à la sous rubrique
    4 / "rubrique" / 5 / "rubrique" / 0 // association de la sous rubrique à la rubrique mère

    Le schéma des tables dans ma base :

    - la table produit :

    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
    CREATE TABLE `produit` (
      `produit_id` smallint(5) unsigned NOT NULL,
      `langue_id` smallint(2) unsigned NOT NULL,
      `produit_ref` varchar(20) NOT NULL,
      `produit_titre` varchar(255) NOT NULL,
      `produit_accroche` text NOT NULL,
      `produit_corp` text NOT NULL,
      `produit_prix` varchar(10) NOT NULL,
      `produit_reduction` varchar(10) NOT NULL,
      `produit_stock` smallint(3) unsigned NOT NULL,
      `accueil` tinyint(1) unsigned NOT NULL,
      `date_creation` date NOT NULL,
      `date_modification` date NOT NULL,
      `visible` tinyint(1) unsigned NOT NULL,
      PRIMARY KEY  (`produit_id`),
      KEY `produit_ref` (`produit_ref`),
      KEY `produit_titre` (`produit_titre`),
      KEY `produit_prix` (`produit_prix`),
      KEY `produit_reduction` (`produit_reduction`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    - la table node :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE TABLE `node` (
      `parent` smallint(5) unsigned NOT NULL,
      `parent_type` varchar(20) character set latin1 NOT NULL,
      `enfant` smallint(5) unsigned NOT NULL,
      `type` varchar(20) character set latin1 NOT NULL,
      `ordre` smallint(5) unsigned NOT NULL,
      PRIMARY KEY  (`parent`,`parent_type`,`enfant`,`type`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    Mon souci c'est que j'aimerai trier selon les marques des produits mais je n'arrive pas à le faire dans une seul requête. J'espère t'avoir bien indiqué mes contraintes.

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 952
    Points
    3 952
    Par défaut
    Saluton,
    Pourquoi avoir choisi cette solution de la table `node` où l'information est très redondante et dont la mise à jour doit s'avérer bien complexe ?

  3. #3
    Membre du Club Avatar de erehcab
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 215
    Points : 57
    Points
    57
    Par défaut
    J'ai voulu essayer parce avec cette méthode j'ai pu faire une class qui me gère tous mes enregistrements. Et puis ça me permet de gérer facilement toute mes CIM à partir du moment ou ce n'est pas des ternaires ou plus ... C'est sur que la table node se retrouve vite avec beaucoup de tuples mais bon ...
    En ce qui concerne la mise à jour j'ai une class qui la gére et qui n'est pas plus compliqué que ça.

  4. #4
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    Tu dois aussi avoir une tables des rubriques, non ? (contenant notamment les marques)

    Si j'ai bien compris ta structure, tu dois pouvoir essayer une requête comme :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT sr.rubrique_nom, p.produit_ref, p.produit_titre
    FROM produit p
        JOIN node nsr ON nsr.enfant = p.produit_id AND nsr.type = "produit"
        JOIN rubrique sr ON nsr.parent = sr.rubrique_id
        JOIN node nr ON nr.enfant = nsr.parent
        JOIN rubrique r ON nr.parent = r.rubrique_id
    WHERE r.rubrique_nom = 'marque'
    ORDER BY sr.rubrique_nom
    J'ai associé à chaque table un alias :
    - p => produit
    - nsr => noeud sous-rubrique
    - sr => sous-rubrique
    - nr => noeud rubrique
    - r => rubrique

    La jointure limitant la rubrique mère à 'marque' peut être évitée en mettant directement un filtre sur l'identifiant de cette rubrique sur l'alias nr, mais il me semble que la requête est plus facile à maintenir comme ça (on comprend ce qu'elle fait comme restriction sur les rubriques sans avoir à connaître l'identifiant des rubriques).

  5. #5
    Membre du Club Avatar de erehcab
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 215
    Points : 57
    Points
    57
    Par défaut
    Super j'y suis presque ! merci beaucoup !

    Oui effectivement j'ai bien une table rubrique. En faite maintenant il faut que je branche sur la requête que tu m'as proposé une autre jointure parce que je dois aussi récupérer uniquement les produits de la rubrique sélectionné par l'internaute.

  6. #6
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par erehcab Voir le message
    Oui effectivement j'ai bien une table rubrique. En faite maintenant il faut que je branche sur la requête que tu m'as proposé une autre jointure parce que je dois aussi récupérer uniquement les produits de la rubrique sélectionné par l'internaute.
    Pour ça, deux jointures supplémentaires avec de nouveaux alias des tables node et rubrique, et le tour est joué

  7. #7
    Membre du Club Avatar de erehcab
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 215
    Points : 57
    Points
    57
    Par défaut
    J'ai du mettre de côté cette requête pendant quelques semaines ... (pas bien !!!). Je me suis remis dessus aujourd'hui pour finir ce travail et avec tes indications Eusebe et en repartant à 0 j'ai réussi.

    Un grand merci pour ton aide

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

Discussions similaires

  1. [VxiR2] Tri sur une variable complexe
    Par SGA99 dans le forum Webi
    Réponses: 5
    Dernier message: 05/01/2011, 18h44
  2. Tri d'une requête sur une valeur ou une autre
    Par mims1664 dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/08/2009, 18h40
  3. Tri sur une requête
    Par PIEPLU dans le forum Langage SQL
    Réponses: 9
    Dernier message: 29/03/2009, 13h29
  4. Colle sur un tri dans une requête linq to sql
    Par boby62423 dans le forum Linq
    Réponses: 5
    Dernier message: 18/03/2009, 11h01
  5. Encore une requête complexe sur plusieurs tables
    Par DenPro dans le forum Langage SQL
    Réponses: 5
    Dernier message: 09/12/2003, 20h05

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