Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/09/2011, 19h12   #1
Membre à l'essai
 
Inscription : septembre 2010
Messages : 71
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 71
Points : 22
Points : 22
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 :
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
Malatok est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 22h31   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
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 :
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 :
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/09/2011, 23h38   #3
Membre à l'essai
 
Inscription : septembre 2010
Messages : 71
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 71
Points : 22
Points : 22
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.
Malatok est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 11h09   #4
Membre à l'essai
 
Inscription : septembre 2010
Messages : 71
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 71
Points : 22
Points : 22
bon alors j'ai testé ta requête :
Code :
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
Malatok est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 11h16   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 11h58   #6
Membre à l'essai
 
Inscription : septembre 2010
Messages : 71
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 71
Points : 22
Points : 22
J'ai une table t_rel_kvlg qui contient

exemple :
table t_key

Code :
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 :
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'.
Malatok est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 12h28   #7
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Citation:
La je veux regarder la valeur la clé id_kvlg 120 Mais mon problème est qu'une clé na pas forcement le dernier goroco. La clé test2 par exemple a un goroco 6
Jusque là, je comprends.

Citation:
mais vu que que la dernière modificiation a été fait a la version 6
Quelle dernière modification ? Ça correspond à la colonne t_key.end_version ?

Citation:
elle aparait dans la dernière version a savoir 18.
Et là je ne comprends plus !

Que doit rendre ta requête comme résultat (en français et en valeurs) ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 14h31   #8
Membre à l'essai
 
Inscription : septembre 2010
Messages : 71
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 71
Points : 22
Points : 22
t_key :
Citation:
id_key = 1 ; label =test1 ;id_category = 518 ; id_project = 1; start_version = 16 ; end_version = 0 ; commentaire = bla.
id_key = 2 ; label =test2 ;id_category = 530; id_project = 1; start_version = 6 ; end_version = 0 ; commentaire = bla.
t_rel_kvlg :
Citation:
id_kvlg = 56 ; id_key = 1 ; id_value = 1000 ; id_locale = 2 ; id_goroco = 16
id_kvlg = 120 ; id_key =1 ; id_value = 1200 ; id_locale = 2 ; id_goroco = 18
id_kvlg = 152 ; id_key = 2 ; id_value = 1300 ; id_locale = 2 ; id_goroco = 6
En fait, dans la table t_rel_kvlg, il peut y avoir des clés qui ont été créées en version 6, comme la clé test2 et qui, dans cette table, n'ont qu'une entrée, depuis qu'elles ont été créées, et qui conservent cette valeur pour les versions supérieures. Ça évite de multiplier les entrées dans la table t_rel_kvlg.
A savoir que cette ligne :
Citation:
id_kvlg = 152 ; id_key = 2 ; id_value = 1300 ; id_locale = 2 ; id_goroco = 6
est valable pour la version 7 8 9 10 11 12 13 14 15 16 17 18 ...
Tant qu'il n'y a pas une entrée supérieure pour le goroco (avec le même id et la même locale )
Malatok est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 15h59   #9
Membre à l'essai
 
Inscription : septembre 2010
Messages : 71
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 71
Points : 22
Points : 22
En fait, je crois avoir trouvé la requête mais je ne suis vraiment pas sûr :

En gros il faudrait que cette requête-là devienne ma sous-requête REQUÊTE 1
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT r.id_key,
MAX(r.id_goroco) AS id_goroco,
MAX(r.id_value) AS id_value,
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
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 
GROUP BY r.id_key, r.id_locale, k.start_version, k.end_version )
Et que dans ma requête (parent, mère, je sais pas trop si c'est ça que l'on dit en SQL) j'ai une requête de ce type-là :
REQUËTE 2
Code :
1
2
 SELECT value FROM  t_value v WHERE v.value = 'plop'AND
REQUÊTE 1
Quelqu'un sait comment il faut faire ?
Malatok est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 15h50   #10
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 433
Points : 6 433
Oui, il suffit de faire une jointure entre les 2 requêtes :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT value FROM  t_value v 
INNER JOIN (
    SELECT r.id_key,
    MAX(r.id_goroco) AS id_goroco,
    MAX(r.id_value) AS id_value,
    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
    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 
    GROUP BY r.id_key, r.id_locale, k.start_version, k.end_version )
) t ON v.id_value = r.id_value
WHERE v.value = 'plop'
... En supposant que la donnée commune soit bien id_value, de ce que j'ai cru comprendre.
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/09/2011, 13h30   #11
Membre à l'essai
 
Inscription : septembre 2010
Messages : 71
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 71
Points : 22
Points : 22
Merci beaucoup pour la réponse mais le seul problème malheuresement :
Unknown column 'r.id_value' in 'on clause'
il ne connait pas la table r car elle est dans la sous requête.
Malatok est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 14h06   #12
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Saluton,
Dans la clause ON, r.id_value est devenu t.id_value, si je ne m'abuse.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 14h28   #13
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Met l'alias de la sous-requête à la place : t
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 14h30   #14
Membre à l'essai
 
Inscription : septembre 2010
Messages : 71
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 71
Points : 22
Points : 22
Citation:
Saluton,
Dans la clause ON, r.id_value est devenu t.id_value, si je ne m'abuse.
A ba tout de suite ca marche ...
J'etais parti dans un truc :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
SELECT VALUE, v.id_value FROM  t_value v INNER JOIN t_rel_kvlg r ON r.id_value = v.id_value
INNER JOIN (SELECT r.id_key, 
MAX(r.id_goroco) AS id_goroco,
MAX(r.id_value) AS id_value
FROM t_rel_kvlg r INNER JOIN t_key k ON k.id_key = r.id_key
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 
GROUP BY r.id_key, r.id_locale, k.start_version, k.end_version ) t ON v.id_value = t.id_value
WHERE v.VALUE = 'to be translated'
Et au niveau de ce que ca me renvoyé c'étais un peu n’importe quoi ....
Effectivement juste en changent le t à la fin ca me renvoie bien ce que je veux.
Un grand merci a tout le monde en tout cas.
Cordialement
Malatok est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 14h42   #15
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 433
Points : 6 433
Au temps pour moi... Me suis gouré dans l'alias...
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h40.


 
 
 
 
Partenaires

Hébergement Web