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 :

Galère pour une requête SQL


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut Galère pour une requête SQL
    Bonjour,

    Je galère pour effectuer une requête sur deux tables :

    J'ai une Table PRODUITS, avec le champs id
    Une table Prix, avec les champs id, id_produit, prix (valeur du prix)

    Je souhaite récupérer TOUS les produits, du moins cher au plus cher, sachant qu'un produit a plusieurs prix. J'ai dont effecté la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Produits.id,Produits.id_rubrique FROM Produits LEFT JOIN Prix ON Prix.id_produit=Produits.id ORDER BY Prix.Prix ASC
    Le problème, c'est qu'il me renvoi autant de fois le même produit qu'il y a de prix pour ce produit... par exemple, si un produit à 3 prix, il me renvoi trois fois le même produit.

    Que puis-je faire pour résoudre ce problème et ne sortir qu'une fois un même produit, associé à son prix minimum ?

    Merci.
    Vive Visual Studio.net !!!

  2. #2
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    Ajoute
    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  3. #3
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Salut,

    Si je suis ce que tu as dit :
    - tu veux l'id_produit
    - tu veux le prix min

    --> tu n'as pas besoin de faire de jointure, tu as tout dans ta table prix (a moins que j'ai mal compris).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT P.id_produit , MIN(P.Prix) 
    FROM Prix
    GROUP BY P.id_produit
    ORDER BY P.Prix ASC
    A+
    ~ Lola ~

  4. #4
    Membre confirmé Avatar de elbj
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Services à domicile

    Informations forums :
    Inscription : Novembre 2004
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Bonjour
    tu n'as pas besoin de faire de jointure, tu as tout dans ta table prix (a moins que j'ai mal compris)
    En fait c'est lespalom qui n'est pas assez précis mais il me semble qu'il veut récupérer plus que l'Id des produits. Auquel cas la jointure est nécessaire.

    Cordialement
    Christophe B.

  5. #5
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Salut Elbj,
    Bonjour lola06 (Toujours un plaisir ),

    En effet :
    lespalom, ta requête que tu présente est-elle bien complète?
    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  6. #6
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Salut tout le monde....
    comme tu vois on a du mal a cerner ce que tu veux...
    Precise nous :
    * ce que tu souhaite avoir comme résultat
    -- Exemple de données :
    ID PRIX
    -- ----
    1 12
    1 23
    1 15
    2 10


    -- Le résultat attendu :
    (la c'est ce que j'ai compris)
    ID MIN(PRIX)
    -- ---------
    2 10
    1 12
    * ton SGBD

    A+
    ~ Lola ~

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    Oui c'est bien le résultat que je veux obtenir. Chtulus, j'ai enlevé une partie pour ne pas vous embrouiller, mais j'ai oublié d'enlever le Produits.id_Produits (j'avais mis un WHERE Produits.id_produit=@id_produit)

    Je me réexplique , plus complet. Voici mes tables :

    PRODUITS
    - id
    - id_rubrique

    PRIX
    - id
    - id_produit
    - prix (valeur du prix en décimal, ex : 1,5)

    Je souhaite donc récupérer tous les Produits d'une rubrique donnée (id_rubrique), et qu'ils soient classés en sortie selon leur prix minimum, du plus petit au plus grand. En gros, cela se décompose par :
    1. On sélectionne tous les produits 1 par 1
    2. Pour chaque produit, je recherche son prix mini dans la table PRIX
    3. Enfin, après avoir examiné tous les prix mini, je veux qu'en sortie de ma requête, il me renvoi TOUS les produits de la rubrique ID_Rubrique, classés selon leurs prix mini.

    Exemple :

    Table produits :

    ID ID_RUBRIQUE
    -- ----
    1 1
    2 2
    3 1
    4 1

    Table Prix :

    ID ID_Produit PRIX
    -- -------- ----
    1 1 10
    2 1 12
    3 1 8
    4 2 4
    5 1 16
    6 3 5
    7 4 1
    8 2 18
    9 4 16
    10 3 15

    -> Le résultat attendu en sortie :

    ID (de la table produit, pour la rubrique 1)
    4
    3
    1

    Voilà, j'espère que c'est un peu plus clair

    Merci.
    Vive Visual Studio.net !!!

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 789
    Points
    30 789
    Par défaut
    Et comment se fait la relation entre la table Produits et la table Prix ?
    Prix.Id_produit = Produits.Id ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    Yes !
    Vive Visual Studio.net !!!

  10. #10
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 789
    Points
    30 789
    Par défaut
    Comme ç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  tmp.id_produit
    FROM    (   SELECT  prd.id_rubrique
                    ,   prx.id_produit
                    ,   MIN(prx.prix)   AS minprix
                FROM    prix    AS prx
                    INNER JOIN
                        produits    AS prd
                        ON  prd.id = prx.id_produit
                GROUP BY prd.id_rubrique
                    ,   prx.id_produit
            )   AS tmp
    WHERE   tmp.id_rubrique = 1
    ORDER BY tmp.minprix
    ;
    Edit : Ce serait plus simple si le même nom de colonne était utilisé dans les tables pour définir le même objet
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    Qu'est ce que tmp ?
    Vive Visual Studio.net !!!

  12. #12
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 789
    Points
    30 789
    Par défaut
    L'alias de la table dérivée...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    J'ai executé :

    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  tmp.id_produit
    FROM    (   SELECT  Produits.id_rubrique
                    ,   Prix.id_produit
                    ,   MIN(Prix.prix)   AS minprix
                FROM    prix    AS Prix
                    INNER JOIN
                        produits    AS Produits
                        ON  Produits.id = tmp.id_produit
                GROUP BY Produits.id_rubrique
                    ,   Prix.id_produit
            )   AS tmp
    WHERE   tmp.id_rubrique = 1
    ORDER BY tmp.minprix
    ;
    Mais il n'en veut pas, le message d'erreur est : "L'identificateur en plusieurs parties "tmp.id_produit" ne peut pas être lié."

    Merci.

    PS : je suis débutant en SQL...
    Vive Visual Studio.net !!!

  14. #14
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 789
    Points
    30 789
    Par défaut
    Citation Envoyé par lespalom Voir le message
    PS : je suis débutant en SQL...
    Je t'encourage à consulter le Cours SQL
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  15. #15
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    @al1_24, il n'y a pas plus simple comme solution ?
    Personnellement j'aurai fait (mais je me trompe peut être):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT P.id_produit , MIN(P.Prix),  
    FROM Prix
    GROUP BY P.id_produit
    ORDER BY P.Prix ASC
    Résultat :
    ID_Produit PRIX
    -------- ----
    4 1
    2 4
    3 5
    1 8
    ------------------------------------------------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT P.id_produit , MIN(P.Prix), B.id_rubrique
    FROM Prix P, Produit B
    WHERE B.id = P.id_produit AND B.id_rubrique = 1
    GROUP BY P.id_produit
    ORDER BY P.Prix ASC
    Résultat :
    ID_Produit PRIX ID_Rubrique
    -------- ---- -----------
    4 1 1
    3 5 1
    1 8 1
    ~ Lola ~

  16. #16
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Lola : je pense que mettre dans le select et dans le order by des colonnes qui ne sont pas dans le groupement, ça va te poser problème.

    lespalom : c'est quoi ton SGBD ?

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  17. #17
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Lola : je pense que mettre dans le select et dans le order by des colonnes qui ne sont pas dans le groupement, ça va te poser problème.
    Oui tu as raison, désolée , en fait j'ai mélangé ce qu'il veut et ce que j'ai fait pour que ça soit plus clair (pas trop réussi )...

    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT P.id_produit
    FROM Prix P, Produit B
    WHERE B.id = P.id_produit AND B.id_rubrique = 1
    GROUP BY P.id_produit
    ORDER BY P.Prix ASC
    lespalom : c'est quoi ton SGBD ?
    +1, tu ne l'as toujours pas précisé...
    ~ Lola ~

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    Je bosse sur SQL Server 2005, via SQL Server Management Studio (gratuit, et excellent !).

    Lola, j'ai essayé, ta technique, mais on en revient au même point qu'au début, à savoir que j'ai deux fois le même ID du produit en sortie.

    Ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT P.id_produit
    FROM Prix P, Produits B
    WHERE B.id = P.id_produit AND B.id_rubrique = 1
    GROUP BY P.id_produit,P.Prix
    ORDER BY P.Prix ASC
    Tu as vu, j'ai rajouté le P.Prix dans le GROUP BY, car il ne voulait pas valider la requête sans ça.
    Vive Visual Studio.net !!!

  19. #19
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Citation Envoyé par lespalom Voir le message
    Lola, j'ai essayé, ta technique, mais on en revient au même point qu'au début, à savoir que j'ai deux fois le même ID du produit en sortie.
    Je m'embrouille, désolée, je crois que je vais me coucher tôt ce soir...
    Est ce que cette syntaxe est bonne ?
    Est ce que c'est gênant si tu affiche le prix en plus de l'id_produit ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT P.id_produit , MIN(P.Prix)
    FROM Prix P, Produit B
    WHERE B.id = P.id_produit AND B.id_rubrique = 1
    GROUP BY P.id_produit
    ORDER BY P.Prix ASC
    Par contre si tu regroupe par P.Prix c'est sur qu'il y aura des problèmes, si tu as :
    ID PRIX
    -- ----
    1 10
    1 12
    1 12
    1 13

    Tu auras pour résultat (avec ta requête) :
    ID PRIX
    -- ----
    1 10
    1 12
    1 13
    ~ Lola ~

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    Non ce n'est pas génant, car ensuite je le traite dans le code de mon application. Mais c'est toujours la même requête... non ? En tous cas j'ai toujours le même résultat.
    Vive Visual Studio.net !!!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Aidez moi pour une requête SQL server
    Par pop10 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 19/06/2007, 22h15
  2. problème de syntaxe delphi pour une requête sql
    Par socooooool dans le forum Bases de données
    Réponses: 12
    Dernier message: 07/07/2006, 16h53
  3. Besoin d'aide pour une requête SQL
    Par Borami dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/11/2005, 10h33
  4. Réponses: 3
    Dernier message: 18/06/2005, 00h31
  5. Besoin d'aide pour une Requête SQL ...
    Par Kokito dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/07/2004, 11h56

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