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 avec un MIN


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2004
    Messages : 83
    Points : 196
    Points
    196
    Par défaut Problème requête avec un MIN
    Bonjour à tous,

    J'ai un soucis avec une requête, il me semble que c'est simple, mais je bloque dessus depuis pas mal de temps, alors que la réponse est, je suis sûr, très simple !

    Je vous donne ma table de test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE IF NOT EXISTS `test_concours` (
      `id` int(11) NOT NULL auto_increment,
      `concours` varchar(255) NOT NULL,
      `score` int(11) NOT NULL,
      `nom` varchar(255) NOT NULL,
      PRIMARY KEY  (`id`)
    )
    et les valeurs de test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    INSERT INTO `test_concours` (`id`, `concours`, `score`, `nom`) VALUES 
    (1, 'superconcours', 45, 'tommy'),
    (2, 'superconcours', 56, 'bob'),
    (3, 'superconcours', 89, 'tommy'),
    (4, 'lo-cado', 52, 'tommy'),
    (5, 'lo-cado', 85, 'bob'),
    (6, 'cadomania', 39, 'bob'),
    (7, 'superconcours', 33, 'peter'),
    (8, 'cadomania', 45, 'peter'),
    (9, 'cadomania', 69, 'bob'),
    (10, 'megaprix', 59, 'tommy');
    Je recherche à avoir le plus petit score, et le nom du participant ayant eu ce score, pour chaque concours.

    Je devrais avoir ceci :

    10 megaprix 59 tommy
    4 lo-cado 52 tommy
    7 superconcours 33 peter
    6 cadomania 39 bob

    Mais impossible de faire ça avec une requête non imbriquée (j'ai besoin d'une requête non imbriquée pour inclure des options de filtres).

    Voici la requête que j'ai en ce moment, qui me donne pas vraiment les bons résultats (essayer avec MIN et MAX) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT concours, id, score, nom  
    FROM test_concours
    GROUP BY concours 
    HAVING score = MIN(score)
    ORDER BY concours
    J'ai bien sur cherché sur internet, mais rien de ce que j'ai pu essayer ne marche.

    Merci pour votre aide sur ce problème !

    Guildem

  2. #2
    Membre averti
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2007
    Messages
    497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 497
    Points : 330
    Points
    330
    Par défaut
    Et un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT concours, id, min(score), nom  
    FROM test_concours
    GROUP BY concours, id, nom
    Ca focitonne?

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 243
    Points : 12 874
    Points
    12 874
    Par défaut
    Xian => La requête n'est pas bonne, car tu auras la note min par concours et par participant.
    Il faut utiliser une sous-requête corrélée:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT concours, id, score, nom  
    FROM test_concours
    where not exists(select * from test_coucours as t2 where t2.id = test_coucours.id and t2.score < test_concours.score)
    Ou alors (mais pas sûr):
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT concours, id, score, nom  
    FROM test_concours
    where test_concours = min(select score from test_coucours as t2 where t2.id = test_coucours.id )

    Tatayo

  4. #4
    Membre averti
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2007
    Messages
    497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 497
    Points : 330
    Points
    330
    Par défaut
    En tout cas une piste ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT concours, min(score)
    FROM test_concours
    GROUP BY concours
    ca renvoye ce que tu veux.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2007
    Messages
    497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 497
    Points : 330
    Points
    330
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Xian => La requête n'est pas bonne, car tu auras la note min par concours et par participant.
    Tatayo
    Oui je m'en suis rendu compte apres avoir repondu
    J'ai teste tes requetes ca marche pas non plu :s

  6. #6
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut,

    une autre piste à essayer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select test.* from test_concours test 
    join 
    (select min(score) as mini,concours from test_concours group by concours) tmp 
    on test.concours=tmp.concours and test.score = tmp.mini
    order by concours;

  7. #7
    Membre habitué
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2004
    Messages : 83
    Points : 196
    Points
    196
    Par défaut
    Merci pour vos tests, je vais regarder ce que cela donne. Maintenant, j'ai une autre contrainte que j'ai précisé dans ma demande, c'est que je vais avoir des filtres sur mes résultats (vu que la table finale contient des dates, et d'autres données sur les concours).
    Il faudrait donc que je n'ai pas dans ma requête de table renommée (ex: FROM test_concours AS tmp), pour pouvoir inclure les filtres nécessaires.

    Je ne sais pas si je me fais bien comprendre !! (le SQL ça fatigue les neurones)

    Je vous fait un retour en début d'après midi pour les pistes fournies.

    Merci à vous.

    Guildem

    EDIT: Merci Cybher pour la correction en "code" des requêtes

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 878
    Points : 53 055
    Points
    53 055
    Billets dans le blog
    6
    Par défaut
    La solution en pur SQL normatif :

    La table et les données :
    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
    21
    22
    23
    24
    25
    26
    CREATE TABLE test_concours
    ( id int NOT NULL PRIMARY KEY,
      concours varchar(25) NOT NULL,
      score int NOT NULL,
      nom varchar(16) NOT NULL);
     
    INSERT INTO test_concours (id, concours, score, nom) 
    VALUES (1, 'superconcours', 45, 'tommy');
    INSERT INTO test_concours (id, concours, score, nom) 
    VALUES (2, 'superconcours', 56, 'bob');
    INSERT INTO test_concours (id, concours, score, nom) 
    VALUES (3, 'superconcours', 89, 'tommy');
    INSERT INTO test_concours (id, concours, score, nom) 
    VALUES (4, 'lo-cado', 52, 'tommy');
    INSERT INTO test_concours (id, concours, score, nom) 
    VALUES (5, 'lo-cado', 85, 'bob');
    INSERT INTO test_concours (id, concours, score, nom) 
    VALUES (6, 'cadomania', 39, 'bob');
    INSERT INTO test_concours (id, concours, score, nom) 
    VALUES (7, 'superconcours', 33, 'peter');
    INSERT INTO test_concours (id, concours, score, nom) 
    VALUES (8, 'cadomania', 45, 'peter');
    INSERT INTO test_concours (id, concours, score, nom) 
    VALUES (9, 'cadomania', 69, 'bob');
    INSERT INTO test_concours (id, concours, score, nom) 
    VALUES (10, 'megaprix', 59, 'tommy');
    La requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT id, concours, score, nom 
    FROM   (SELECT *, RANK() OVER(PARTITION BY concours ORDER BY score DESC) AS N
            FROM   test_concours) AS T
    WHERE  N= 1
    Le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    id          concours                  score       nom
    ----------- ------------------------- ----------- ----------------
    6           cadomania                 39          bob
    4           lo-cado                   52          tommy
    10          megaprix                  59          tommy
    7           superconcours             33          peter
    Malheureusement certains SGBSR (comme MySQL) n'accepte pas les fonctions de fenêtrage de la norme SQL:2003.

    A +

  9. #9
    Membre habitué
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2004
    Messages : 83
    Points : 196
    Points
    196
    Par défaut
    Bonjour à tous,

    Merci beaucoup pour votre aide, j'ai pu modifier ma requête en fonction de vos idées, et j'ai fini par retomber sur le résultat que j'attendais.

    Merci aussi à SQLPro pour sa solution qui était bien sur inexploitable en MySQL 5.0, mais m'ont permis d'apprendre l'existance de la norme SQL:2003 !

    Enfin désolé pour le temps de réponse, je n'ai pas pu retoucher à ces requêtes avant aujourd'hui.

    Problème résolu !

    Guildem

  10. #10
    Membre averti
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2007
    Messages
    497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 497
    Points : 330
    Points
    330
    Par défaut
    Et la solution etait????

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

Discussions similaires

  1. Problème requête avec INSTR()
    Par yohan0262 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 13/06/2007, 10h20
  2. Problème requête avec access
    Par celiaaa dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 29/05/2007, 12h40
  3. Problème requête avec 2 conditions
    Par omgirl dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 12/07/2006, 16h19
  4. Problème requête avec group by et distinct
    Par tomca dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/07/2005, 16h10
  5. Problème requête avec UNION et ORDER BY
    Par Yann21 dans le forum Langage SQL
    Réponses: 12
    Dernier message: 12/12/2003, 11h02

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