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 :

pb requete avec jointure ( conditionnelle !?!)


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 26
    Points : 27
    Points
    27
    Par défaut pb requete avec jointure ( conditionnelle !?!)
    bonjour,

    J'ai deux tables que je souhaite utiliser dans ma base de données :
    - une table genes_in_operons (id_operon INT , locus VARCHAR, id_organism INT)
    -all_vs_all (locus VARCHAR, accessionVARCHAR, Pvalue INT)

    la table genes_in_operons contient tous les 'locus' que je souhaite afficher dans mes resultats. Ci-dessous ma requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT id_operon,genes_in_operons.locus,A1.Pvalue,A2.Pvalue FROM genes_in_operons
    LEFT OUTER JOIN all_vs_all AS A1
    ON genes_in_operons.locus=A1.locus
    LEFT OUTER JOIN all_vs_all AS A2
    ON A1.locus=A2.accession
    WHERE A2.locus=$locus_target
    AND A1.accession=$locus_target
    AND id_organism =$id_org_refer
    $locus_target et id_org_refer étant defini precedemment dans mon code (c'est du perl, mais peu importe)

    Mon probleme est que la jointure sur les deux tables all_vs_all n'existe pas toujours. Mais je voudrais un resultat du genre :

    +--------------------------------------------------------------+
    | id_operon | locus | A1.Pvalue |A2.Pvalue |
    +--------------------------------------------------------------+

    Et que quand la condition A0.locus=A1.locus ou A0.locus =A2.accession ne peut pas etre trouvé dans les tables jointes la ligne s'affiche quand meme dans les resultats, sans renseigner les deux derniers champs.

    Voila j'espere avoir été a peu pres clair. Si ce n'est pas le cas, je suis a votre entiere disposition.

    Merci d'avance.

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 142
    Points : 185
    Points
    185
    Par défaut
    Je crois que tu as oublié de préciser à quelle table faisait référence A0. :/
    A genes_in_operons je présume ?

  3. #3
    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 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Bonjour,

    Je suis pas sûr d'avoir tout bien saisi, mais essaie en changeant la deuxième condition de jointure comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT id_operon,genes_in_operons.locus,A1.Pvalue,A2.Pvalue FROM genes_in_operons
    LEFT OUTER JOIN all_vs_all AS A1
    ON genes_in_operons.locus=A1.locus
    LEFT OUTER JOIN all_vs_all AS A2
    ON genes_in_operons.locus=A2.accession
    WHERE genes_in_operons.locus=$locus_target
    AND A1.accession=$locus_target
    AND id_organism =$id_org_refer
    La différence, c'est que si il n'y a pas de correspondance entre genes_in_operons et accession, la seconde jointure peut quand même se faire.

    ced

  4. #4
    Nouveau membre du Club
    Inscrit en
    Juillet 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 26
    Points : 27
    Points
    27
    Par défaut
    Merci de vous interesser à mon cas.
    Corcenant le A0, c'est juste une erreur de copie dans le poste, mais lors des mes essais j'avais bien mis le A0 en alias de ma table genes_in_operons.

    Concernant la deuxieme solution (ced), j'ai effectivement essayé ça, mais le resultat et le meme.En effet en général lorsque la premiere jointure n'est pas possible, la deuxieme non plus)

    En fait pour mieux expliquer mon probleme :

    -j'ai ma table gene_in_operons avec une liste de genes (locus) (cette table contient tous les locus que je souhaite avoir dans mon resultat)

    -la deuxieme table all_vs_all, contient une liste de comparaison entre ces genes (locus vs accession) et lui attribue une valeur de vraissemblance (Pvalue). Seulement dans cette table il n'y a pas toutes les comparaisons entre tous les genes de la table genes_in_operons.

    en realite dans une premiere requete je recupere tous les genes de la table genes_in_operon (dans un boucle, donc un gene a chaque tour que j'appelle 'x'). Puis dans une deuxieme boucle, je recupere une serie d'autres genes (que j'appelle 'y'). Et dans la meme requete, je souhaite recuperer la Pvalue correspondante a X comparé à Y, et Y comparé àX.Et si la comparaison n'existe pas (ligne inexistante dans la table all_vs_all) qu'il me renvoie la valeur NULL ou UNDEF pour mes Pvalues. Et actuellement la requete ne me renvoie la ligne que si tous les champs existent !! Voila J'espere avoir eclairci le probleme.

    Je sais pas trop, peut etre inserer des sous requetes, ou je ne sais pas quoi. Je pourrais resoudre le probleme en faisant trois requetes, mais comme la base de données est considerable, la perte de temps devient importante.

    Je precise que ce sont des requetes executés dans un programme perl (USE DBI

    Pour résumé, je veux afficher simplement ma table genes_in_operons, et lorsque la jointure est possible, je la fait et j'affiche les valeurs, si impossible afficher la ligne avec des valeurs NULL pour les deux derniers champs.

    Merci d'avance.

    Bien entendu, toujours a votre disposition pour de plus amples renseignements.

    PS:si d'aventure vous aviez une idée pour mettre un titre un peu plus parlant, je suis preneur !!

  5. #5
    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 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Bon, je suis toujours pas sûr de comprendre ce que tu appelles des boucles...
    Ce sont des boucles du code ?
    Autre question, qui conditionne un peu la requête : est-ce que, dans all_vs_all, tu as une symétrie entre locus et accession. Je m'explique : reprenons X et Y comme locus, as-tu potentiellement 2 lignes différentes avec locus = X, accession = Y pour l'une (et sa Pvalue) puis locus = Y, accession = X pour l'autre (avec sa Pvalue, qui peut être la même ou pas... on s'en moque pour la requête).
    Voilà une requête qui croise tous les X et Y d'un coup, sans ramener le cas X = X :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select gio.locus, gio2.locus, ava.locus, ava.accession, ava.Pvalue
    from genes_in_operons gio
    inner join genes_in_operons gio2 on gio.locus <> gio2.locus
    left join all_vs_all ava on ava.locus = gio.locus and ava.accession = gio2.locus
    order by gio.locus, gio2.locus
    Ca fait ce que tu veux ?

    ced

  6. #6
    Nouveau membre du Club
    Inscrit en
    Juillet 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 26
    Points : 27
    Points
    27
    Par défaut
    ok, oui on peut trouver deux lignes comparant X et Y donnant une Pvalue, puis une comparant Y et X donnant une autre Pvalue. Ton code ne me donnait pas tout a fait ce que je voulais, mais il m'a permis de me rendre compte que je devais inclure mes conditions sur le ON des jointures. Au bout du compte, le code est assez simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT A0.id_operon,A0.locus,A1.Pvalue,A2.Pvalue
    FROM genes_in_operons A0
    LEFT JOIN all_vs_all A1 ON A1.locus=A0.locus and A1.accession=$locus_target
    LEFT JOIN all_vs_all A2 ON A2.accession=A1.locus and A2.locus=$locus_target
    where A0.id_organism=$id_org_target
    Merci d'avoir passer du temps sur mon problème.

    Bonne continuation.

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

Discussions similaires

  1. requetes avec jointures conditionnelles
    Par danytro dans le forum Requêtes
    Réponses: 2
    Dernier message: 03/09/2012, 11h35
  2. Requete avec jointure conditionnelle
    Par grunk dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/08/2009, 16h00
  3. recherche aide pour requete avec jointure
    Par nebil dans le forum Requêtes
    Réponses: 5
    Dernier message: 21/08/2006, 17h03
  4. [MySQL] Erreur dans une requête avec jointures
    Par bobic dans le forum Langage SQL
    Réponses: 17
    Dernier message: 03/08/2006, 13h04
  5. requete avec jointure & group by
    Par de LANFRANCHI dans le forum Langage SQL
    Réponses: 9
    Dernier message: 27/07/2004, 14h31

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