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

Langage SQL Discussion :

Selectionner derniére valeurs d'une colone avec jointures


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2012
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2012
    Messages : 50
    Par défaut Selectionner derniére valeurs d'une colone avec jointures
    Bonjour

    Mon but est de récupérer l'idruche, la dernière valeur pour le poids et le dernier enregistrement "date" pour chaque ruche.

    Tables :
    Data (IDDATA, POIDS, DATE)
    DataRuche(IDDATA, IDRUCHE)

    Voici ma requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DataRuche.IDRUCHE, Data.POIDS, Data.DATE FROM Data INNER JOIN DataRuche ON DataRuche.IDDATA ORDER BY Data.DATE DESC LIMIT 1 ;
    Elle fonctionne mais le problème c'est que ça me récupère les dernières valeurs juste pour une ruche or je voudrais que ça récupère les dernières valeurs pour CHAQUE ruche.

    Auriez vous une petite idée svp ?

    Merci à vous

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 603
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Si vous souhaitez récupérer la dernière valeur de poids mesurée pour chaque ruche, allez jeter un coup d'œil sur mon blog, il aborde justement ce sujet
    Plusieurs solutions y sont proposées, à vous de choisir celle qui convient selon votre SGBD

    Deux remarques au sujet de votre requete :
    - limit ne restreint que l'affichage, la requête parcourt toutes les lignes correspondantes au prédicat, c'est donc une solution acceptable pour des requêtes à la volée sur petit volume, mais pas pour des requêtes pérennes
    - utilisez des alias, ça vous facilitera la vie

    Il semble que vous utilisez MySQL, à confirmer en précisant version (sachant que la V8 comporte de grosses améliorations et notamment les fonctions OLAP qui n'étaient pas accessibles jusqu'alors)

  3. #3
    Membre averti
    Inscrit en
    Novembre 2012
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2012
    Messages : 50
    Par défaut
    Bonjour,

    Merci pour votre réponse je vais lire votre article.

    En effet j'utilise MySQL 5.7.23 sous linux.

    En fait je ne vois pas trop quelle condition il faut que je rajoute pour que ca parse tous mes IDRUCHE

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 603
    Billets dans le blog
    10
    Par défaut
    Je pense qu'il y a un souci dans la définition de vos tables

    Si une ruche fait l'objet de zéro à plusieurs mesures et qu'une mesure concerne une et une seule ruche, vous devriez avoir les tables suivantes

    RUCHE_RU(RU_id, RU_nom...)
    MESURE_ME(ME_id, ME_date, ME_poids, ..., RU_id FK)

    En ce cas, une solution possible pour connaitre la dernière mesure pour chaque ruche devient la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select RU.RU_nom
         , RU.RU_id
         , ME.ME_date
         , ME.ME_poids
    from ruche RU
    left join mesure ME
      on ME.RU_id=RU.RU_id
    where not exists
         (select 1
          from mesure M2
          where M2.RU_id=RU.RU_id
            and M2.ME_date>ME.ME_date)
    Puisque vous utilisez une vielle version de MySQL, pas de fonction OLAP possible, mais vous pouvez aussi utiliser un MAX ou une jointure OUTER avec test de nullité (cf. mon blog)

    Note : DATE est un mot réservé SQL, à éviter pour nommer vos objets base de données. Le fait de préfixer les noms de colonnes par un mnémonique table comme je l'ai fait ci-dessus (ME_date...) permet d'éviter ce genre d'erreur tout en facilitant la recherche sur l'origine des informations

  5. #5
    Membre averti
    Inscrit en
    Novembre 2012
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2012
    Messages : 50
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Je pense qu'il y a un souci dans la définition de vos tables

    Si une ruche fait l'objet de zéro à plusieurs mesures et qu'une mesure concerne une et une seule ruche, vous devriez avoir les tables suivantes

    RUCHE_RU(RU_id, RU_nom...)
    MESURE_ME(ME_id, ME_date, ME_poids, ..., RU_id FK)

    En ce cas, une solution possible pour connaitre la dernière mesure pour chaque ruche devient la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select RU.RU_nom
         , RU.RU_id
         , ME.ME_date
         , ME.ME_poids
    from ruche RU
    left join mesure ME
      on ME.RU_id=RU.RU_id
    where not exists
         (select 1
          from mesure M2
          where M2.RU_id=RU.RU_id
            and M2.ME_date>ME.ME_date)
    Puisque vous utilisez une vielle version de MySQL, pas de fonction OLAP possible, mais vous pouvez aussi utiliser un MAX ou une jointure OUTER avec test de nullité (cf. mon blog)

    Note : DATE est un mot réservé SQL, à éviter pour nommer vos objets base de données. Le fait de préfixer les noms de colonnes par un mnémonique table comme je l'ai fait ci-dessus (ME_date...) permet d'éviter ce genre d'erreur tout en facilitant la recherche sur l'origine des informations
    Bonjour et merci beaucoup, j'ai modifié la structure de ma BDD en ajoutant IDRUCHE dans ma table Data et maintenant la requete fonctionne.

    Merci beaucoup à vous

  6. #6
    Membre émérite
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

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

    Effectivement, si DataRuche est la table des ruches et Data la table des mesures associées aux ruches, la modélisation est plutôt :

    dataruche (idruche)
    data (idruche, poids, date_mesure)

    Une requête possible pour ton besoin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select dataruche.idruche, poids, date_mesure
    from dataruche left join data on dataruche.idruche = data.idruche
    where (date_mesure = (select max(d2.date_mesure) from data d2 where d2.idruche = dataruche.idruche)
     or date_mesure is null)
    Remarque : "or date_mesure is null" permet la sélection des ruches sans mesure (les colonnes poids et date_mesure sont alors null). A supprimer si pas besoin.

    Bloon

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

Discussions similaires

  1. dernière valeur d'une liste par défaut
    Par faulk dans le forum Access
    Réponses: 2
    Dernier message: 11/07/2006, 12h34
  2. Réponses: 19
    Dernier message: 07/06/2006, 08h06
  3. [ABAP] Comment créer une requête avec jointure
    Par roadster62 dans le forum SAP
    Réponses: 1
    Dernier message: 21/02/2006, 16h04
  4. optimisation d'une requête avec jointure
    Par champijulie dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 07/07/2005, 09h45
  5. Extraire une valeur d'une ligne avec sed
    Par jojolepabo dans le forum Linux
    Réponses: 6
    Dernier message: 27/10/2004, 09h34

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