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 :

Requete SELECT avec jointures


Sujet :

Requêtes MySQL

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 110
    Points : 68
    Points
    68
    Par défaut Requete SELECT avec jointures
    Bonjour a tous,

    J'ai trois table comme suit :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    -- Table de gestion des langues, permet de pouvoir ajouter une langue aisement par la suite
     
    CREATE TABLE `blp_gst_langue` (
      `id_gst_langue` tinyint(3) unsigned NOT NULL auto_increment,
      `langue_abrg` char(2) NOT NULL default '',
      `langue` varchar(255) NOT NULL default '',
      PRIMARY KEY  (`id_gst_langue`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
     
    -- Contenu de la table `blp_gst_langue`
     
    INSERT INTO `blp_gst_langue` VALUES (1, 'fr', 'Français');
    INSERT INTO `blp_gst_langue` VALUES (2, 'en', 'English');
    INSERT INTO `blp_gst_langue` VALUES (3, 'de', 'Deutsch');
     
    -- Table des produits, table stockant toutes les données d un produit qui ne sont pas soumises a la traduction
     
    CREATE TABLE `blp_produit` (
      `id_produit` smallint(4) unsigned NOT NULL auto_increment,
      `id_categorie` tinyint(3) unsigned NOT NULL default '0',
      `nom` varchar(128) NOT NULL default '',
      `prix` float unsigned NOT NULL default '0',
      `cepages` text NOT NULL,
      PRIMARY KEY  (`id_produit`),
      KEY `id_categorie` (`id_categorie`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=22 ;
     
    -- Contenu de la table `blp_produit`
     
    INSERT INTO `blp_produit` VALUES (1, 1, 'Blanc de Blancs', 10, 'Raisins blanc, Raisins bleu turquoise');
     
     
    -- Table stockant toutes les données d un produit soumises a la traduction, donc actuellement doit avoir 3 entrees par produits car 3 langues 
     
    CREATE TABLE `blp_produit_multi` (
      `id` int(9) unsigned NOT NULL auto_increment,
      `id_produit` smallint(4) unsigned NOT NULL default '0',
      `id_gst_langue` tinyint(3) unsigned NOT NULL default '0',
      `degustation` longtext NOT NULL,
      `accord` longtext NOT NULL,
      PRIMARY KEY  (`id`),
      KEY `id_produit` (`id_produit`),
      KEY `id_gst_langue` (`id_gst_langue`),
      KEY `id_produit_2` (`id_produit`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
     
    -- Contenu de la table `blp_produit_multi`
     
    INSERT INTO `blp_produit_multi` VALUES (1, 1, 1, 'Excellent ce p''tit pif', 'Il accompagnera à merveille une Marlboro très certainement.');
    INSERT INTO `blp_produit_multi` VALUES (2, 1, 2, 'A really nice pif.', 'A viscious bitch will suit with it.');
    INSERT INTO `blp_produit_multi` VALUES (3, 1, 3, 'h lkjqsdrh fkljeh rkljhzelkjrh', ' kljgerh oitjerkoj tlkmjertkljerlmktj erth');
     
    -- Table stockant les ctaegories de produits
     
    CREATE TABLE `blp_produit_categorie` (
      `id_categorie` tinyint(3) unsigned NOT NULL default '0',
      `id_gst_langue` tinyint(3) unsigned NOT NULL default '0',
      `nom` varchar(128) NOT NULL default '',
      `description` longtext NOT NULL,
      KEY `id_gst_langue` (`id_gst_langue`),
      KEY `id_categorie` (`id_categorie`),
      KEY `id_categorie_2` (`id_categorie`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
     
    -- Contenu de la table `blp_produit_categorie`
     
    INSERT INTO `blp_produit_categorie` VALUES (1, 1, 'Vins effervescents', '');
    INSERT INTO `blp_produit_categorie` VALUES (1, 2, 'Sparkling wines', '');
    INSERT INTO `blp_produit_categorie` VALUES (1, 3, 'Affsprache quellee bellee languee', '');
    Voila , je cherche donc maintenant a recuperer toutes les infos pour le produit ayant pour id(id_produit) 1.

    Voici ma requete (qui ne marche pas)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT P.id_produit,P.id_categorie AS id_cat,P.nom,P.prix,P.cepages,PC.nom AS categorie,
    			PM.degustation,PM.accord 
    			FROM blp_produit P, blp_produit_categorie PC, blp_produit_multi PM 		
    			WHERE 
    			P.id_categorie = PC.id_categorie 
    			AND PC.id_gst_langue = 1 
    			AND P.id_produit = 1 
    			AND PM.id_produit = P.id_produit
    Ce qui me renvoie 3 enregistrement , alors que je n en veux qu 1 contenant les champs degustation et accord de la table blp_produit_multi dans les trois langues(donc 3 entrees de la table blp_produit_multi)

    Si qq un peut m aider je l en remercie par avance.

  2. #2
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT P.id_produit,P.id_categorie AS id_cat,P.nom,P.prix,P.cepages,PC.nom AS categorie,
    			PM.degustation,PM.accord 
    			FROM blp_produit P JOIN blp_produit_multi PM USING (id_produit) JOIN blp_produit_categorie PC USING (id_gst_langue)
    			WHERE 
    			P.id_categorie = PC.id_categorie 
    			AND PC.id_gst_langue = 1 
    			AND P.id_produit = 1 
    			AND PM.id_produit = P.id_produit


    Je fais un JOIN sur id_gst_langue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FROM blp_produit P JOIN blp_produit_multi PM USING (id_produit) JOIN blp_produit_categorie PC USING (id_gst_langue)
    J'ai laisser tomber
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    blp_produit_categorie PC JOIN blp_produit P USING (id_categorie)
    Ce qui est peut être une erreur?



    Jasmine,
    -- Jasmine --

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 110
    Points : 68
    Points
    68
    Par défaut
    Non je ne pense pas que ce soit une erreur d avoir abandonner ce JOIN pour la categorie, mais par contre avec ta requete je ne recupere bien qu un enregistrement mais qui ne contient que la version francaise de degustation et accord, une autre idée peut etre, car je suis obligé d avouer mes limites la.

  4. #4
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Ce qui me renvoie 3 enregistrement , alors que je n en veux qu 1 contenant les champs degustation et accord de la table blp_produit_multi dans les trois langues(donc 3 entrees de la table blp_produit_multi)
    Mais je pensais que c'est ce que tu voulais récupérer...tu veux récupérer quoi si ce n'est pas cela?

    Ou alors tu veux toutes les langues possibles sur une seule ligne (ce qui à mon avis n'est pas possible)? Pourquoi mettre langue = 1 alors?




    Jasmine,
    -- Jasmine --

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 110
    Points : 68
    Points
    68
    Par défaut
    id_gestion_langue = 1 , me sert a recuperer le nom de la categorie uniquement en francais, c'est pour une interface admin et les editeurs seront tous francophones, par contre il faut que j affiche degustation et accord dans toutes les langues de l applic, et j ai aussi une doute sur le fait que ce soit possible ...

  6. #6
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Pour ton site utilises-tu php? Je ne connais pas bien mais pourquoi ne pas faire cela deux requêtes?
    1) pour récuperer le nom de la categorie uniquement en francais
    2) récupérer degustation et accord dans toutes les langues
    Et placer toutes ces valeurs dans des variables puis les afficher comme tu le souhaites. N'est-ce pas envisageable?

    Jasmine,
    -- Jasmine --

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 110
    Points : 68
    Points
    68
    Par défaut
    Oui j utilise php.
    Ca l est tout a fait , pas tres optimisé certes mais envisageable , d ailleurs c est surement ce que je vais faire temporairement tout du moins.

  8. #8
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    pas tres optimisé certes
    Tu veux dire au niveau du temps que va prendre les requêtes?
    ^^ ou bien au niveau de ton travail et du nombre de lignes de code que tu vas devoir écrire

    Parce qu'au niveau du temps pour obtenir les informations, il vaut peut être mieux deux petites requêtes qu'une seule kilométrique !


    Jasmine,
    -- Jasmine --

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 110
    Points : 68
    Points
    68
    Par défaut
    taquine avec ceci Jasmine, j aime beaucoup ....

  10. #10
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Ca prend tant de temps que ça de faire deux requêtes?
    Avec ta myriade d'index ça doit pourtant être bien optimisé
    Quelle taille ont tes tables?

    Jasmine,
    -- Jasmine --

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 110
    Points : 68
    Points
    68
    Par défaut
    non c est tres rapide, cette solution est digne de consideration, et quand a la replique concernant les index, je reverai de la caser a mon chez de projet

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

Discussions similaires

  1. Delete + selection avec jointure
    Par kluh dans le forum Oracle
    Réponses: 4
    Dernier message: 15/11/2005, 10h44
  2. Problème performance SELECT avec jointure
    Par Netgamer dans le forum Requêtes
    Réponses: 7
    Dernier message: 05/08/2005, 10h20
  3. probleme requete select avec 2 colonnes
    Par cricri45000 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 21/04/2005, 10h39
  4. requete select avec AS remplacement de valeur
    Par pi3141563 dans le forum Requêtes
    Réponses: 3
    Dernier message: 17/04/2004, 22h15
  5. requete SELECT avec un nombre constant
    Par gurumeditation dans le forum Requêtes
    Réponses: 3
    Dernier message: 04/07/2003, 20h04

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