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 :

Problème requête SQL


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2021
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Problème requête SQL
    Bonjour,
    alors voilà je travaille sur un projet étudiant et je souhaiterais faire une certaine requête qui me pose un souci puisque j'arrive à obtenir les résultats voulu en passant par plusieurs requêtes mais j'aimerais pouvoir le faire en une seule.

    Donc le problème porte sur 3 tables que je vais simplifier :
    Entrainement(_CléEntrainement_, Nom)
    Exercice(_CléExercice_, Intensité, CléEntrainement, CléDifficulté)
    Difficulté(_CléDifficulté_, Couleur)

    Ce que je souhaite obtenir c'est la couleur de la difficulté lié à l'exercice ayant l'intensité la plus élevé d'un Entrainement et le nom de cet Entrainement, et j'aimerais donc pouvoir faire ça sur chaque ligne d'Entrainement.
    Pour l'instant j'arrive à peu près à quelque chose en faisant ça en plusieurs requête puis en automatisant et en faisant du passage de clé à l'aide d'un programme, mais je n'arrive pas à trouver une solution en une seule requête.
    Pour l'instant je procède ainsi : une requête récupère les clés et nom des entrainements, puis pour chaque clé je fais une autre requête où je récupère l'Exercice.CléDifficulté de l'exercice ayant l'intensité maximal parmi ceux ayant pour CléEntrainement la clé récupéré avec la requête précédente, puis je fais une requête pour la Couleur avec la CléDifficulté récupérée à la requête précédente.
    Je suis débutant en SQL, et j'ai beau réfléchir je ne vois pas trop comment faire. Avec des sous-requêtes j'arrive à "simplifier" les deux requêtes dernières requêtes en une seule mais c'est pas réellement utile et je ne pense pas que ce soit la bonne façon de faire.
    Cordialement

    EDIT :
    Après avoir utilisé un peu ma tête j'ai pu arriver à cette solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT Entrainement.Nom, Difficulte.Couleur
    FROM Entrainement INNER JOIN Exercice on Entrainement.CleEntrainement = Exercice.CleEntrainement
    AND Exercice.CleExercice IN (SELECT Exercice.CleExercice
    FROM Exercice
    WHERE (exercice.CleEntrainement,Exercice.Intensite) IN (SELECT Exercice.CleEntrainement AS Entrainement, MAX(Exercice.Intensite) AS Maximum
    		FROM Exercice
    		GROUP BY Exercice.CleEntrainement ))
    INNER JOIN Difficulte on Exercice.CleDifficulte=Difficulte.CleDifficulte
    Plus court, plus simple à comprendre.

  2. #2
    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 801
    Points
    30 801
    Par défaut
    Quelles sont les requêtes que tu as déjà préparées ?
    Il ne manque peut être pas grand chose pour les connecter...
    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.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2021
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Pour l'instant j'ai la première requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM Entrainement
    Puis en récupérant les clés depuis cette dernière j'utilise la requête préparée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    SELECT Difficulté.Couleur FROM Difficulté
    WHERE Difficulté.CléDifficulté=
    	(
    	SELECT T1.Id
    	FROM (
    		SELECT Exercice.CléDifficulté AS Id, MAX(Exercice.Intensité) AS Maximum
    		FROM Exercice
    		WHERE Exercice.CléEntrainement={X}
    		GROUP BY Exercice.CléDifficulté  
    		) AS T1
    	WHERE T1.Maximum=(
    		SELECT MAX(T2.Maximum) 
    		FROM (
    			SELECT Exercice.CléDifficulté  AS Id, MAX(Exercice.Intensité) AS Maximum
    			FROM Exercice
    			WHERE Exercice.CléEntrainement={X}
    			GROUP BY Exercice.CléDifficulté 
    			) AS T2
    		)
    	)
    Où {X} est la partie qui sera remplacé par les clés récupérées avec la première requête. Évidemment, je pense que, déjà, il doit y avoir des façons de simplifié la deuxième requête, mais si je pouvais avoir une seule requête pour obtenir le résultat que je veux et éviter de passer par des requêtes préparées ce serait bien.

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Bonsoir

    il est préférable de ne pas utiliser de caractères spéciaux comme les accents dans les noms de colonnes, ça facilite grandement la vie

    Voici un exemple de solution (dans laquelle j'ai enlevé les accents), il y en a d'autres

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    select EN.Nom            as Nom_ent
         , EX.Intensite      as Max_int
         , DI.Couleur
    from  Entrainement as EN
    inner join
          Exercice     as EX
       on EX.CleEntrainement=EN._CleEntrainement_
    inner join 
          Difficulte   as DI
       on DI._CleDifficulte_=EX.CleDifficulte
    where not exists
         (select 1
          from Exercice as X2
          where X2.CleEntrainement=EX.CleEntrainement
            and X2.Intensite>EX.Intensite
         )
    order by EN.Nom

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

Discussions similaires

  1. Problème requête SQL
    Par mandaillou dans le forum Langage SQL
    Réponses: 15
    Dernier message: 03/10/2005, 11h37
  2. Problème requête SQL dans page ASP
    Par rocs dans le forum ASP
    Réponses: 14
    Dernier message: 26/07/2005, 15h38
  3. problème requête sql
    Par psychoBob dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/07/2005, 17h50
  4. problème requête sql
    Par perfectdams dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 21/06/2005, 18h09
  5. Réponses: 8
    Dernier message: 23/10/2003, 16h22

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