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 :

association d'éléments fausse


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 87
    Par défaut association d'éléments fausse
    Bonjour,
    J'ai une base de donnée dans laquel je met des "tag" fonctionnant sous différentes fréquences. Pour le tag A on a la fréquence a, tag B fré b ...
    Et malheureusement ma jointure (lorsque je recherche un élément par exemple le tag a) me donne le tableau suivant:

    Tag|fréq
    ------------------
    A | a
    A | b
    B | a
    B | b

    Je pense que vous devez connaitre ce problème, merci d'avance pour votre aide!

  2. #2
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Par défaut
    salut,

    sans plus d'éléments, difficile de t'aider.
    Comment sont construites tes tables?
    Quelle requete effectue tu?
    quel est le résultat attendu?

    A+

    Michel

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 87
    Par défaut
    Alors pour le résultat c'est simple, je veut:
    Tag | Freq
    -----------
    A | a
    B | b

    (car la fréquence b n'a rien a voir avec le tag A et vice versa)

    Mais ça c'est un exemple, la structure de ma table est bien plus compliqué!
    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
    CREATE TABLE `tag` (
      `NumTag` mediumint(9) NOT NULL auto_increment,
      `IDfab` mediumint(9) NOT NULL,
      `NomTag` text NOT NULL,
      `Alim` text,
      `IDtailleMem` mediumint(9) default NULL,
      `IDtypeMem` mediumint(9) default NULL,
      `IDfreq` mediumint(9) default NULL,
      `Temperature` text,
      `Fonction` text,
      `IndiceProtection` text,
      `Forme` text,
      `RTLS` text,
      `Dimension` text,
      `IDapp` mediumint(9) default NULL,
      `CommentaireTag` text,
      PRIMARY KEY  (`NumTag`),
      KEY `IDapplication` (`IDapp`),
      KEY `IDfrequence` (`IDfreq`),
      KEY `IDfabricant` (`IDfab`),
      KEY `IDtailleMemoire` (`IDtailleMem`),
      KEY `IDtypeMemoire` (`IDtypeMem`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
    Et ma requète est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT tag.NomTag, fabricant.Nomfabricant, tag.Alim, taillemem.Taille, typemem.Type, frequence.Freq, tag.Temperature, tag.Fonction, tag.IndiceProtection, tag.Forme, tag.RTLS, tag.Dimension, application.app
     
              FROM tag INNER JOIN fabricant INNER JOIN frequence INNER JOIN application INNER JOIN taillemem INNER JOIN typemem
     
              ON (tag.IDfab=fabricant.IDfabricant) AND (tag.IDfreq=frequence.IDfrequence) AND (tag.IDapp=application.IDapplication)
     
              WHERE tag.Alim='$_POST[AlimTag]' AND tag.IDfreq='$_POST[IDfrequence]' AND tag.Fonction='$_POST[Fonction]' AND tag.rtls='$_POST[rtls]' AND application.IDapplication='$_POST[IDapplication]'
    Et ce n'est pas juste la fréquence qui s'associe avec toutes mes valeurs mais les champs taillemem typemem aussi...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 87
    Par défaut
    Je ne sais pas trop si c'est un problême de jointure externe/interne ... j'ai pas pafaitement compris le fonctionnement de ces jointures...

    Je corrige juste une chose:
    Seuls les champs taillemem et typemem affichent toutes les valeurs de leurs tables (en faisant toutes les associations possibles) alors que j'avais bien déclaré les valeurs correspondantes à mon tag:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO `tag` (`NumTag`, `IDfab`, `NomTag`, `Alim`, `IDtailleMem`, `IDtypeMem`, `IDfreq`, `Temperature`, `Fonction`, `IndiceProtection`, `Forme`, `RTLS`, `Dimension`, `IDapp`, `CommentaireTag`) VALUES 
    (5, 1, 'NewOne', 'Active', 2, 1, 2, '12', 'Lecture', 'ip68', 'carré', 'non', '20*20', 2, 'ert');
    Comme vous le voyez, pourIDtaillemem et IDtypemem, ce sont des clés qui recherchent la valeur dans les tables taillemem et typemem (d'ou la jointure avec ces tables!)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 87
    Par défaut
    Bon alors en faite j'ai réussis à dépanner mon code! j'avais oublié de mettre des conditions dans ma jointure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... AND (taillemem.IDtailleMemoire=tag.IDtailleMem) AND (typemem.IDtypeMemoire=tag.IDtypeMem)
    Mais je ne comprends pas qd même de quel droit il associe des valeurs de manières différentes à ce que j'avais entré dans ma base??
    Il n'y a pas une requète mysql pour interdire ça?

  6. #6
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 059
    Par défaut
    Bonjour,

    Vu la syntaxe des tes jointures, pas surprenant que ça ne fasse pas ce que tu souhaites...
    La syntaxe des jointures est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT...
    FROM table1
    INNER JOIN table2 ON table1.chp1 = table2.chp2
    INNER JOIN table3 ON table1.chp1 = table3.chp3
    INNER JOIN ...
    Bref, on met INNER JOIN une table ON condition de jointure pour cette table, et non pas toutes les jointures puis toutes les conditions...

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  7. #7
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Par défaut
    bon prenons le requete simplifiée pour revenir au résultat que tu souhaites:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT tag.NomTag, tag.Alim, frequence.Freq, tag.Temperature, tag.Fonction, tag.IndiceProtection, tag.Forme, tag.RTLS, tag.Dimension, 
    FROM tag I
    INNER JOIN frequence  ON tag.IDfreq=frequence.IDfrequence 
    WHERE tag.Alim='$_POST[AlimTag]' 
    AND tag.IDfreq='$_POST[IDfrequence]' 
    AND tag.Fonction='$_POST[Fonction]' 
    AND tag.rtls='$_POST[rtls]'
    Si tu fais une requete de ce genre, tu lies tes tables où les ID fréquences sont les meme
    Donc si tu as A|b , tu dois avoir dans tes tables une ligne où l'id freq de A vaut celle de b

  8. #8
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Par défaut
    pour éviter ce genre de problème où tu crées des produits cartésiens, le mieux est d'écrire la requete de cette facon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT tag.NomTag, fabricant.Nomfabricant, tag.Alim, taillemem.Taille, typemem.Type, frequence.Freq, tag.Temperature, tag.Fonction, tag.IndiceProtection, tag.Forme, tag.RTLS, tag.Dimension, application.app
    FROM tag 
    INNER JOIN fabricant ON tag.IDfab=fabricant.IDfabricant
    INNER JOIN frequence ON tag.IDfreq=frequence.IDfrequence
    INNER JOIN application ON tag.IDapp=application.IDapplication
    INNER JOIN taillemem ON taillemem.IDtailleMemoire=tag.IDtailleMem
    INNER JOIN typemem ON typemem.IDtypeMemoire=tag.IDtypeMem
    WHERE tag.Alim='$_POST[AlimTag]' AND tag.IDfreq='$_POST[IDfrequence]' AND tag.Fonction='$_POST[Fonction]' AND tag.rtls='$_POST[rtls]' AND application.IDapplication='$_POST[IDapplication]'

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 22/04/2009, 11h17
  2. [VB.NET] Associer une clé aux éléments d'une combo
    Par Cereal123 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 30/03/2009, 14h52
  3. Gros soucis avec mon onclick. Je n'arrive pas à l'associer à mon élément
    Par takinelinfo dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/07/2008, 11h34
  4. Réponses: 11
    Dernier message: 26/03/2007, 23h53
  5. Réponses: 2
    Dernier message: 26/07/2006, 12h46

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