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

Requêtes MySQL Discussion :

Sélectionner la ligne contenant le plus grand nombre [MySQL-5.5]


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 162
    Points : 90
    Points
    90
    Par défaut Sélectionner la ligne contenant le plus grand nombre
    Bonjour,

    Je souhaiterais de l'aide pour établir une requête.

    J'ai une base de données qui gère des examens. Une table indique en fonction du grade la liste des épreuves. Cette table est ORGANISATION.

    Voici cette table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    mysql> desc organisation;
    +----------------+---------+------+-----+---------+----------------+
    | Field          | Type    | Null | Key | Default | Extra          |
    +----------------+---------+------+-----+---------+----------------+
    | IdOrganisation | int(11) | NO   | PRI | NULL    | auto_increment |
    | IdGrade        | int(11) | NO   | MUL | NULL    |                |
    | IdEpreuve      | int(11) | NO   | MUL | NULL    |                |
    +----------------+---------+------+-----+---------+----------------+
    3 rows in set (0.02 sec)
    IdGrade et IdEpreuve sont des clés étrangères.

    Lorsque que je calcule le nombre d'épreuves par grade, pas de problème. Voici la requête et le résultat :
    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
     
    mysql> select idgrade, count(*) from organisation group by idgrade;
    +---------+----------+
    | idgrade | count(*) |
    +---------+----------+
    |      10 |        7 |
    |      11 |        7 |
    |      12 |        7 |
    |      13 |        7 |
    |      14 |        7 |
    |      15 |        7 |
    |      16 |        8 |
    |      17 |        8 |
    |      18 |        8 |
    |      19 |        9 |
    |      20 |       10 |
    |      21 |       11 |
    |      22 |       10 |
    +---------+----------+
    Maintenant, je voudrais établir la requête qui me donne la(les) ligne(s) dont le nombre d'épreuves est le plus élevé. Dans mon exemple, c'est la ligne dont l'IDGRADE est 21, dont le nombre d'épreuves est 11. Malheureusement je n'y arrive nullement.

    Si quelqu'un pouvait m'aider, je lui en serais très reconnaissant. Merci par avance.

  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 786
    Points
    30 786
    Par défaut
    As-tu cherché un peu dans ce forum, ou dans Langage SQL ?
    Ce problème revient très régulièrement, parfois aussi sous la forme "le dernier message" ou "la dernière facture"...
    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
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 162
    Points : 90
    Points
    90
    Par défaut
    Sincèrement, oui, j'ai cherché.

    Lorsqu'il s'agit de trouver la dernière date, le plus fort montant, la plus haute note, j'ai effectivement trouvé la solution. Si l'information cherchée est stockée dans un champ, pas de problème.

    Dans mon cas, c'est différent : je ne cherche pas une donnée dans un champ, je cherche le nombre d'instances de la table EPREUVE pour une valeur unique de la table GRADE. Les épreuves selon le grade changent chaque année.

    En Oracle SQL, la solution existe, je la connais. En MySQL, je cherche depuis hier soir, je n'ai pas encore trouvé.

    Cordialement

  4. #4
    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 786
    Points
    30 786
    Par défaut
    Dans le cas général, la requête est de cette forme ou quelque chose d'équivalent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select  id
        ,   val
    from    matable
    where   val =
            (   select  max(val)
                from    matable
            )
    Dans ton cas particulier, la table sur laquelle tu effectues la recherche est la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select  idgrade
        ,   count(*) 
    from    organisation 
    group by idgrade
    Il suffit donc de remplacer l'identifiant de table par la requête, en n'oubliant pas que les restrictions sur le résultat d'un regroupement se faut dans la clause HAVING et pas WHERE.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select  idgrade
        ,   count(*) 
    from    organisation 
    group by idgrade
    having  count(*)  = 
            (   select  max(cnt)
                from    (   select  idgrade
                                ,   count(*)  as cnt 
                            from    organisation 
                            group by idgrade
                        )
            )
    Rien de complexe, juste des solutions simples combinées
    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.

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 162
    Points : 90
    Points
    90
    Par défaut
    Un immense merci !

    La requête que tu me donnes est la bonne ! Une erreur me demande d'ajouter un alias :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select  idgrade
        ,   count(*) 
    from    organisation 
    group by idgrade
    having  count(*)  = 
            (   select  max(cnt)
                from    (   select  idgrade
                                ,   count(*)  as cnt 
                            from    organisation 
                            group by idgrade
                        ) table1
            );
    Et cela me donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    +---------+----------+
    | idgrade | count(*) |
    +---------+----------+
    |      21 |       11 |
    +---------+----------+
    1 row in set (0.03 sec)
    C'est tout simplement parfait. Comme je n'ai quasiment aucune compétence en MySQL, je n'aurais pas si facilement trouvé. J'ai bien vu le mot clé LIMIT sur un autre article, je trouve cependant cette solution bien meilleure, car j'ai personnellement horreur de ce genre d'artifice.

    Encore merci !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/04/2013, 12h19
  2. Réponses: 2
    Dernier message: 22/07/2012, 11h44
  3. Réponses: 52
    Dernier message: 13/03/2007, 15h07
  4. Plus grand nombre possible
    Par lia dans le forum C++
    Réponses: 2
    Dernier message: 30/08/2006, 11h22
  5. [Access] Trouver qui a le plus grand nombre de visites
    Par maxidoh dans le forum Langage SQL
    Réponses: 13
    Dernier message: 03/04/2006, 03h00

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