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 :

Selection d'une version par produit


Sujet :

Langage SQL

  1. #1
    Membre habitué Avatar de LaNat
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Points : 164
    Points
    164
    Par défaut Selection d'une version par produit
    Bonjour,
    J'ai un truc qui me parait con à faire mais je n'y arrive pas.
    Mon entreprise a créé 5 logiciels et les vends à d'autres entreprises. Je voudrais afficher, pour une entreprise cliente, la liste des logiciels qu'elle a acheté, mais toutes les mises à jour s'affichent bien entendu. Exemple : L'entreprise Machin a en sa possession de logiciel A versions 1, 2 et 3; le logiciel B version 4 et 5, etc; moi je voudrais n'afficher que les dernieres versions de chaque produit : pour l'entreprise Machin : logiciel A version 3, logiciel B version 5 etc. Vous comprenez?
    Mais je n'arrive pas à trouver la requete SQl correspondante, j'ai essayé avec des group by, having, mais rien ne fonctionne.
    Vous auriez une petite idée??
    Merci d'avance.

  2. #2
    Nouveau membre du Club
    Inscrit en
    Mars 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 49
    Points : 34
    Points
    34
    Par défaut
    tu dois pouvoir avec un group by et un having

    donne les requetes que ta déjà testées
    avec la structure de tes tables

  3. #3
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 396
    Points : 641
    Points
    641
    Par défaut
    Bonjour,
    en devinant la structure de ta base, tu pourrais faire une requête du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select entrep,
             logiciel,
            max(version)
    from Commande
    group by entrep,
                  logiciel
    La faiblesse humaine est d'avoir des curiosités d'apprendre ce qu'on ne voudrait pas savoir

  4. #4
    Membre habitué Avatar de LaNat
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Points : 164
    Points
    164
    Par défaut
    Citation Envoyé par lper
    Bonjour,
    en devinant la structure de ta base, tu pourrais faire une requête du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select entrep,
             logiciel,
            max(version)
    from Commande
    group by entrep,
                  logiciel
    J'avais essayé ce genre de requête, la mienne est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select p.idprod, max(v.dversion), v.nom 
    from produit p, version v, achete a, entreprise e
    where p.idprod=v.idprod
    and a.ident=e.ident
    and a.idprod=p.idprod
    and e.ident='15'
    group by p.idprod;
    Mais il me dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    La colonne 'v.NOM' n'est pas valide dans la liste de sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation ou dans la clause GROUP BY.
    (v.NOM est le 'nom' de la version par exemple 1.3.6)
    Je vais quand meme pas mettre tous les champs de mon select dans mon group by !? Surtout qu'il y a un n° de version unique par produit donc je vois pas l'intérêt de faire un group by dessus...

  5. #5
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 396
    Points : 641
    Points
    641
    Par défaut
    C'est l'erreur classique, tu dois coder sous la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    select p.idprod, v.dversion, v.nom 
    from produit p, version v, achete a, entreprise e 
    where p.idprod=v.idprod 
    and a.ident=e.ident 
    and a.idprod=p.idprod 
    and e.ident='15' 
    and v.dversion = 
     (select max(dversion)
       from version m
      where m.idprod = p.idprod)
    ajoute le group by sur les zones du select selon ta modélisation si nécessaire.
    La faiblesse humaine est d'avoir des curiosités d'apprendre ce qu'on ne voudrait pas savoir

  6. #6
    Membre habitué Avatar de LaNat
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Points : 164
    Points
    164
    Par défaut
    Impeccable, par contre le group by ne fonctionne toujours pas, mais ca fonctionne avec un distinct appliqué sur idprod. Merci beaucoup!!

  7. #7
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 396
    Points : 641
    Points
    641
    Par défaut
    Si tu mets le group by, c'est sur toutes les zones 'non aggrégat' du SELECT, dans l'exemple de ma requête c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    group by p.idprod, v.dversion, v.nom
    Et dans ce cas je ne vois pas pourquoi ça ne fonctionnerait pas.
    La faiblesse humaine est d'avoir des curiosités d'apprendre ce qu'on ne voudrait pas savoir

  8. #8
    Membre habitué Avatar de LaNat
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Points : 164
    Points
    164
    Par défaut
    Citation Envoyé par lper
    Si tu mets le group by, c'est sur toutes les zones 'non aggrégat' du SELECT, dans l'exemple de ma requête c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    group by p.idprod, v.dversion, v.nom
    Et dans ce cas je ne vois pas pourquoi ça ne fonctionnerait pas.
    Ya un truc qui m'échappe : si on mets tous les champs du select, ca ne groupe plus rien au final, j'ai essayé ta requete avec tous les champs dans le group by et en effet, ca ne groupe plus rien et pire, toutes les versions apparaissent, le max(dversion) ne fait meme plus effet.

  9. #9
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 396
    Points : 641
    Points
    641
    Par défaut
    Bizzarre
    Peux tu mettre le code exact stp ?
    La faiblesse humaine est d'avoir des curiosités d'apprendre ce qu'on ne voudrait pas savoir

  10. #10
    Membre habitué Avatar de LaNat
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Points : 164
    Points
    164
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select p.idprod, v.dversion, v.nom 
    from produit p, version v, achete a, entreprise e 
    where p.idprod=v.idprod 
    and a.ident=e.ident 
    and a.idprod=p.idprod 
    and e.ident='16' 
    and v.dversion = 
     (select max(dversion) 
       from version m 
      where m.idprod = p.idprod) 
    group by p.idprod, v.dversion, v.nom
    Alors là c'est à n'y rien comprendre, voila que ca fonctionne maintenant!!! Merci!
    Mais je me pose une autre question (finalement je vais enlever la balise résolu!) cette version m'affiche la dernière version que possède l'entreprise si cette version est la derniere existante, n'est ce pas? Je sais c'est pas clair ce que je dis : si Machin possède le logiciel A version 3 et que cette version est la derniere commercialisée, alors elle s'affichera, mais si la derniere version existante est la 4, ca n'affichera pas que Machin possede la version 3; vu qu'a aucun moment dans la requete dans le max on specifie qu'il s'agit de la version de l'entreprise. C'est vraiment pas facile à expliquer!

  11. #11
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 396
    Points : 641
    Points
    641
    Par défaut
    Je crois avoir compris, dans ce cas il te faut la notion de version au niveau de l'entreprise, dans ce cas tu fais le max plus sur la table version mais sur la table entreprise ou achete...si ce n'est pas clair, décris nous le schéma de ta base.
    La faiblesse humaine est d'avoir des curiosités d'apprendre ce qu'on ne voudrait pas savoir

  12. #12
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Je suppose que la table achete contient le N° de version car sinon on ne saurait pas quelle version l'entreprise a acheté, donc essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT v.idprod, v.dversion, v.nom 
    FROM   version v
    WHERE  v.dversion = (SELECT MAX(dversion) 
                         FROM   achete m 
                         WHERE  m.idprod = a.idprod
                           AND  m.ident  = '16')
    Solution qui me semble la plus simple, et répondant à la question pour une entreprise donnée (ici la '16', comme dans ton exemple, si tu veux la même chose pour toutes les entreprises ayant acheté quelque chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT a.ident, v.idprod, v.dversion, v.nom 
    FROM   version v, achete a
    WHERE  v.idprod   = a.idprod
      AND  v.dversion = a.dversion
      AND  a.dversion = (SELECT MAX(dversion) 
                         FROM   achete m 
                         WHERE  m.idprod = a.idprod
                           AND  m.ident  = a.ident)
    J'ai aussi supposé que ton moteur ne supportait pas la syntaxe standard pour les jointures (INNER JOIN) puisque tu ne les utilises pas.
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  13. #13
    Membre habitué Avatar de LaNat
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Points : 164
    Points
    164
    Par défaut
    A priori avec cette requête ca a l'air de fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select p.idprod, v.dversion, v.nom 
    from produit p, version v, achete a, entreprise e 
    where p.idprod=v.idprod 
    and a.ident=e.ident 
    and a.idprod=p.idprod 
    and e.ident='16' 
    and v.idversion = 
     (select max(idversion) 
       from achete m 
      where m.idversion = a.idversion)
    group by p.idprod, v.dversion, v.nom
    Merci beaucoup à tous pour votre aide!!!

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

Discussions similaires

  1. Select avec une valeur par défaut variable
    Par Toulousaing dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 22/11/2014, 10h05
  2. SELECT sur une table par rapport à une valeur commune
    Par cryborg dans le forum Requêtes
    Réponses: 1
    Dernier message: 17/12/2012, 09h08
  3. Réponses: 5
    Dernier message: 06/08/2012, 03h31
  4. Réponses: 3
    Dernier message: 29/08/2005, 16h44
  5. Réponses: 14
    Dernier message: 29/04/2005, 11h59

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