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 :

Jointure de tables


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 121
    Par défaut Jointure de tables
    Bonjour tout le monde,

    J'ai une requête qui ne fonctionne pas correctement et je ne comprends vraiment pas pourquoi.

    J'ai une requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT t_rel_kvlg.id_key, MAX(t_rel_kvlg.id_value) AS id_value, MAX(t_rel_kvlg.id_goroco) AS id_goroco, t_rel_kvlg.id_locale, t_key.start_version, t_key.end_version 
    FROM t_rel_kvlg, t_key, t_goroco, t_value
    WHERE t_rel_kvlg.id_key = t_key.id_key 
    AND t_key.id_project = t_goroco.id_project
    AND t_value.id_value = t_rel_kvlg.id_value
    AND t_rel_kvlg.id_key IN (SELECT DISTINCT(id_key) AS id_key FROM t_rel_kvlg)  
    AND t_rel_kvlg.id_goroco <= 21 
    AND (t_key.end_version = 0 OR  t_key.end_version >= 21) 
    AND t_goroco.id_project = 1
    AND t_rel_kvlg.id_locale = 2
    AND t_key.start_version <= 21 GROUP BY id_key;
    Qui prend bien en compte le MAX et dès que je rajoute cette ligne ma requête ne tient plus du tout compte du MAX :

    AND t_value.VALUE = 'plop' et pourtant j'ai bien ma jointure entre les 2 tables qui est faite ici t_value.id_value = t_rel_kvlg.id_value.

    Alors pourquoi ça ne tient plus compte du MAX ???
    Là, il faudra m'expliquer car je comprends plus rien.

    Cordialement

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Pas mal de choses à revoir dans cette requête !

    1) Les jointures s'écrivent depuis 1992 avec l'opérateur JOIN.

    2) La condition suivante ne sert à rien, elle sera toujours vraie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND t_rel_kvlg.id_key IN (SELECT DISTINCT(id_key) AS id_key FROM t_rel_kvlg)
    3) La jointure avec t_goroco ne sert à rien puisque la condition porte sur id_project qui figure dans t_key.

    4) Toutes les colonnes du SELECT ne faisant pas l'objet d'une fonction d'agrégation doivent figurer dans le GROUP BY. Un autre SGBD que MySQL aurait refusé cette requête pour cette raison.

    Ta requête récrite avec des alias de tables pour faciliter la lecture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT r.id_key, r.id_locale, k.start_version, k.end_version
        MAX(r.id_value) AS id_value,
        MAX(r.id_goroco) AS id_goroco
    FROM t_rel_kvlg r
    INNER JOIN t_key k ON k.id_key = r.id_key
    INNER JOIN t_value v ON v.id_value = r.id_value
    WHERE r.id_goroco <= 21
        AND r.id_locale = 2
        AND (k.end_version = 0 OR  k.end_version >= 21)
        AND k.start_version <= 21
        AND k.id_project = 1
        AND v.value = 'plop'
    GROUP BY r.id_key, r.id_locale, k.start_version, k.end_version
    À toi de voir si elle donne le bon résultat, sinon explique-nous ce que tu attends de cette requête.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 121
    Par défaut
    A merci beaucoup c'est super sympa !!!!!! franchement je me suis galéré pas mal de temps là-dessus.
    Demain matin je teste ça.
    Je reviens demain pour voir si j'ai d'autres questions .
    Merci encore.

  4. #4
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 121
    Par défaut
    bon alors j'ai testé ta requête :
    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
    SELECT r.id_key,
    MAX(r.id_value) AS id_value,
    MAX(r.id_goroco) AS id_goroco,
    r.id_locale,
    k.start_version,
    k.end_version
    FROM t_rel_kvlg r INNER JOIN t_key k ON k.id_key = r.id_key
    INNER JOIN t_value v ON v.id_value = r.id_value 
    WHERE r.id_goroco <=21 
    AND r.id_locale = 2 
    AND (k.end_version = 0 OR k.end_version >=21 ) 
    AND k.start_version <= 21 
    AND k.id_project = 1 
    AND v.VALUE = 'plop' 
    GROUP BY r.id_key, r.id_locale, k.start_version, k.end_version ;
    Même chose que la requête du haut toujours le même problème ...
    Cette requête fait exactement la même chose que l'ancienne requête que j'ai faite. C'est-à-dire qu'elle ne prend plus en compte la version Maximum du goroco, et affiche les valeurs qui ont 'plop' (c'est bien ce que je veux, mais avec le goroco MAX(version Max) ... et pas des gorocos inférieurs. Je veux les valeurs qui ont plop mais avec le goroco le plus élevé.
    Et pas les gorocos inférieurs ; c'est pour ca que je fais un MAX pour avoir les gorocos MAX.
    Cordialement

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Je crois qu'il va te falloir une sous-requête mais j'ai du mal à deviner comment goupiller tout ça avec la requête actuelle.
    Tu peux expliquer plus concrètement ce qu'est censée faire ta requête ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 121
    Par défaut
    J'ai une table t_rel_kvlg qui contient

    exemple :
    table t_key

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    colones : id_key ; label ;id_category ; id_project ; start_version ; end_version ; commentaire.
                      1       ;    test1 ; 518 ;             1 ;              16             ;      0              ; blabla
                      2      ;      test2 ;    530   ;            1  ;        6              ;       0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    table t_rel_klg
    colones : id_kvlg ; id_key ; id_value ; id_locale ; id_goroco
                      56   ;        1    ;       1000    ;     2         ;       16
                      120  ;       1     ;      1200    ;      2        ;        18
                       152         2             1300            2               6

    Là je veux regarder la valeur de la clé id_kvlg 120. Mais mon problème est qu'une clé n'a pas forcement le dernier goroco. La clé test2 par exemple a un goroco 6 mais vu que la dernière modification a été faite à la version 6, elle apparaît dans la dernière version, à savoir 18. C'est pour ça que dans la table kvlg le MAX de la version, ce sera sur cette valeur que l'on veut vérifier si elle a une valeur 'plop'.

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

Discussions similaires

  1. Jointure de table avec Interbase
    Par ada_b dans le forum InterBase
    Réponses: 21
    Dernier message: 12/05/2010, 19h52
  2. Réponses: 7
    Dernier message: 10/02/2005, 00h13
  3. [FB1.5]Vue avec jointure sur tables ?
    Par Sitting Bull dans le forum SQL
    Réponses: 2
    Dernier message: 07/12/2004, 17h07
  4. jointure sur table et procedure stocké
    Par pram dans le forum SQL
    Réponses: 3
    Dernier message: 18/11/2004, 21h56
  5. requete(jointure 2 tables) qui marche pas
    Par DaxTaz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/06/2004, 17h50

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