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 PostgreSQL Discussion :

Problème dans l'établissement d'une requête


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 129
    Points : 109
    Points
    109
    Par défaut Problème dans l'établissement d'une requête
    Bonjour,

    J'aimerais ici vous exposer un problème dans les résultats attendus de ma requête.

    Le principe de sélection des enregistrement est le suivant : Je cherche à récupérer tous les enregistrements les plus récents par clé (clé étant une foreign key vers une autre table)

    Voici une première requête et les résultats que j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select c.idcle, c.libelle as libelleCle,  vt.idversiontraduction,vt.valeur as valeurTraduction, vt.datecreation from VersionTraduction vt, Cle c    
    					  where  vt.fk_langue=     1      and vt.fk_etat <> 2 and vt.fk_etat <> 4 and vt.fk_cle = c.idcle   
    					  and fk_cle in (select cle.idcle from cle cle where cle.fk_projet = 1 )
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    c.idcle | c.libellecle | vt.valeur| vt.datecreation
    1 | "btn_save" | 5 | "Sauvegarde" | "2009-10-26 09:20:54"
    2 | "btn_cancel" | 3 | "Annuler" | "2009-10-26 09:23:54"
    381 | "title_projet" | 374 | "Projet" | "2009-11-26 15:53:25.204"
    1 | "btn_save" | 379 | "Sauvegarder" | "2009-11-26 15:55:09.204"
    380 | "title_cle" | 602 | "Projet" | "2009-12-03 11:47:01.598"
    610 | "title_rbundle" | 621 | "RBundle" | "2009-12-03 12:17:26.943"
    1 | "btn_save" | 20 | "Sauveg" | "2009-12-03 12:17:26.943"
    Mes résultats sont correctes, la requête me renvoie ce que j'attendais.

    Toutefois, je veux au final une unique traduction par idCle et dans mes résultats j'ai trois enregistrements pour l'idcle 1

    J'ai donc complété ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select c.idcle, c.libelle as libelleCle,  vt.idversiontraduction,vt.valeur as valeurTraduction, vt.datecreation from VersionTraduction vt, Cle c    
    					  where  vt.fk_langue=     1      and vt.fk_etat <> 2 and vt.fk_etat <> 4 and vt.fk_cle = c.idcle   
    					  and fk_cle in (select cle.idcle from cle cle where cle.fk_projet = 1 )    
    									  group by  vt.idversiontraduction,vt.valeur, vt.datecreation, c.idcle, c.libelle   
    									  having vt.datecreation = (select max(vt2.datecreation) from versiontraduction  vt2    
    									  where vt.idversiontraduction = vt2.idversiontraduction)
    Seulement, mes résultats sont identiques aux précédents !

    Comment faire pour ne garder vraiment que LE DERNIER enregistrement pour un idcle donné ?

    Merci d'avance pour votre aide

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Le dernier enregistrement = la dernière date = la plus récente = la date maxi ?
    Il suffit de demander le MAX(datecreation) dans le SELECT.
    En réécrivant la jointure avec la syntaxe normalisée depuis 1992 et en remettant en forme la requête, ça donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT c.idcle, c.libelle AS libelleCle, 
      vt.idversiontraduction, vt.valeur AS valeurTraduction, 
      MAX(vt.datecreation) AS dern_datecreation 
    FROM VersionTraduction vt
    INNER JOIN Cle c ON vt.fk_cle = c.idcle
    WHERE vt.fk_langue = 1 
      AND vt.fk_etat <> 2 
      AND vt.fk_etat <> 4 
      AND fk_cle IN (
        SELECT cle.idcle 
        FROM cle cle 
        WHERE cle.fk_projet = 1 
    )    
    GROUP BY vt.idversiontraduction, vt.valeur, vt.datecreation, c.idcle, c.libelle
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 129
    Points : 109
    Points
    109
    Par défaut
    Tu as compris le principe CinePhil : Le dernier enregistrement = la dernière date = la plus récente = la date maxi pour un idCle donné !

    En outre, le résultat de la requête ne devrait pas m'afficher

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1 | "btn_save" | 5 | "Sauvegarde" | "2009-10-26 09:20:54"
    et
    1 | "btn_save" | 379 | "Sauvegarder" | "2009-11-26 15:55:09.204"
    puisque c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1 | "btn_save" | 20 | "Sauveg" | "2009-12-03 12:17:26.943"
    l'enregistrement le plus récent pour la clé 1 : "btn_save"

    Vois tu ou je veux en venir ?

    P.S : Merci d'avoir reformuler ma requête, toutefois j'obtiens les mêmes résultats que précédemment !

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    OK.
    Je m'en doutais un peu mais vu la nature de ton GROUP BY...

    Donc pour avoir la dernière datecreation de chaque idcle il faut faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT c.idcle, MAX(vt.datecreation) AS dern_datecreation
    FROM VersionTraduction vt
    INNER JOIN Cle c ON vt.fk_cle = c.idcle
    GROUP BY c.idcle
    c.libelle étant fonctionnellement dépendant de c.idcle, on peut avoir le même résultat en ajoutant le libellé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT c.idcle, c.libelle AS libelleCle,
      MAX(vt.datecreation) AS dern_datecreation
    FROM VersionTraduction vt
    INNER JOIN Cle c ON vt.fk_cle = c.idcle
    GROUP BY c.idcle, c.libelle
    Je me pose des questions sur la dernière partie du WHERE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      AND fk_cle IN (
        SELECT cle.idcle 
        FROM cle cle 
        WHERE cle.fk_projet = 1 
    )
    1) A quelle table appartient fk_cle ?
    2) Le IN est-il vraiment nécessaire puisqu'on cherche de nouveau sur la table cle ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Qu'est-ce que idversiontraduction? Une clef primaire?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 129
    Points : 109
    Points
    109
    Par défaut
    Je viens de me rendre compte que dans mes exemples d'enregistrements, la colonne idversiontraduction est en faite la colonne valeur de VersionTraduction.

    Merci pour les solutions proposées.

    Effectivement CinePhil, la requête que tu m'as fourni me donne bien une seule ligne par clé. Seulement, dans mes enregistrements, j'ai absolument besoin de la colonne valeur dans VersionTraduction et c'est ce qui pose problème puisque vt.valeur dans le SELECT devra être également dans le GROUP BY, ce qui fait que j'ai plusieurs enregistrement pour la même clé.

    Concernant la dernière partie du WHERE, elle me servira pour récuperer des clés en fonction d'un contexte précis, elle est donc nécessaire.

    @Estofilo : Oui, idversiontraduction est la clé primaire de VersionTraduction.

    Ma problématique reste donc la même : Comment n'avoir qu'un seul enregistrement par clé si je rajoute vt.valeur dans ma requête.

    Merci d'avance

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Problème classique, pour autant que j'aie bien compris ton besoin :
    Tu veux la valeur qui correspond à la dernière date ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT tmp.idcle, tmp.libelle, tmp.dern_datecreation, v1.valeur
    FROM VersionTraduction AS v1
    INNER JOIN (
      SELECT c.idcle, c.libelle AS libelleCle,
        MAX(vt.datecreation) AS dern_datecreation
      FROM VersionTraduction vt
      INNER JOIN Cle c ON vt.fk_cle = c.idcle
      GROUP BY c.idcle, c.libelle
    ) AS tmp ON v1.fk_cle = tmp.idcle
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 129
    Points : 109
    Points
    109
    Par défaut
    La valeur de versiontraduction la plus récente pour chaque clé oui.

    J'ai modifié ta requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT tmp.libellecle, v1.valeur, tmp.dern_datecreation
    FROM VersionTraduction AS v1 
    INNER JOIN (
      SELECT c.idcle, c.libelle AS libelleCle,
        MAX(vt.datecreation) AS dern_datecreation
      FROM VersionTraduction vt
      INNER JOIN Cle c ON vt.fk_cle = c.idcle
     where vt.fk_langue = 1 and vt.fk_etat <> 2 and vt.fk_etat <> 4 and c.fk_projet = 1
      GROUP BY c.idcle, c.libelle
    ) AS tmp ON v1.fk_cle = tmp.idcle and v1.datecreation = tmp.dern_datecreation
    J'ai donc rajouté une jointure sur datecreation et je semble retrouver les résultats que je souhaites.

    Je reviens sur ce post si c'est pas bon !

    Merci en tout cas.

    EDIT : Ma requête est finalement fonctionelle ! Merci l'aide que vous m'avez apporté !

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 04/06/2015, 13h21
  2. Réponses: 2
    Dernier message: 25/02/2012, 11h31
  3. [A-07] Problème dans un formulaire avec une requète de selection
    Par oraclus dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 24/12/2008, 00h06
  4. problème dans la création d'une requête
    Par LeCogiteur dans le forum Langage SQL
    Réponses: 0
    Dernier message: 25/02/2008, 00h43
  5. Réponses: 7
    Dernier message: 21/05/2007, 16h28

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