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élection de la plus petite valeur au sein d'un GROUP BY


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2015
    Messages : 7
    Points : 19
    Points
    19
    Par défaut Sélection de la plus petite valeur au sein d'un GROUP BY
    Bonjour,

    Dans le cadre de la création d'une d'une Db de chronos sportif (club de nage avec palmes), je suis en train d'écrire quelques requête SQL sur la DB afin d'extraire certaines données à afficher dans un site WEB.
    L'une d'elle est fort simple en principe mais ne me retourne pas exactement ce que je voudrais ...

    Mon (simple) but est de sortir de ma table 'temps' les meilleurs chronos pour chaque discipline nagée 'id#nage'

    pour ce faire, je me base sur GROUP BY et ORDER BY mais le résultat n'est pas correct...

    Voici un extrait de ma table TEMPS :

    |id_temps	 |id#nageur	|id#competition	|id#nage 	|temps_s
    ---------------------------------------------------------------------------------------------
    |1643 		 |VNX		|201504_VERSAIL	|100SF		|53.81
    |1582 		 |VNX		|20150404VITTEL	|100SF		|54.00
    |1515 		 |VNX		|20150315MOSANE	|100SF		|56.09
    |490 		 |VNX 		|201411OPENLIEG	|100SF		|56.77
    |363 		 |VNX 		|201403CPMOSANE	|100SF		|59.38
    
    |1656 		 |VNX		|201504_VERSAIL	|200BF		|146.22
    
    |1564 		 |VNX		|20150404VITTEL	|200SF		|123.32
    |508 		 |VNX		|201411OPENLIEG	|200SF		|126.96
    |1519 		 |VNX		|20150315MOSANE	|200SF		|128.07
    
    |533 		 |VNX 		|201411OPENLIEG	|25APN		|10.96
    |1516 		 |VNX		|20150315MOSANE	|25APN		|11.09
    
    |409 		 |VNX		|201403CPMOSANE	|25SF		|11.64
    |574 		 |VNX		|201411OPENLIEG	|25SF		|11.65
    |1518  		 |VNX		|20150315MOSANE	|25SF		|11.71
    
    |1615 		 |VNX		|201504_VERSAIL	|50APN		|23.03
    |1556 		 |VNX		|20150404VITTEL	|50APN		|23.86
    
    |1571 		 |VNX		|20150404VITTEL	|50BF		|28.62
    |1517 		 |VNX		|20150315MOSANE	|50BF		|28.91
    |622 		 |VNX		|201411OPENLIEG	|50BF		|30.11
    
    |1592 		 |VNX		|20150404VITTEL	|50SF		|24.06
    |1653 		 |VNX		|201504_VERSAIL	|50SF		|24.61
    |665 		 |VNX		|201411OPENLIEG	|50SF		|24.83
    |1520 		 |VNX		|20150315MOSANE	|50SF		|25.77
    |462 		 |VNX		|201403CPMOSANE	|50SF		|25.90
    
    Mon query :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM  `temps` 
    GROUP BY  `id#nage` ASC 
    ORDER BY  `temps_s` ASC
    mais malgré le ORDER BY, il ne sort pas le meilleur temps... mais le premier rencontré dans la table...

    Comment puis-je attaquer ce simple problème ? est- il possible d'afficher le premier record dans groupe classé par un LIMIT ?

    Merci pour votre aide...

    vsiron

  2. #2
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    Citation Envoyé par vsiron Voir le message
    Comment puis-je attaquer ce simple problème ? est- il possible d'afficher le premier record dans groupe classé par un LIMIT ?
    LOL
    Commencez par utiliser un vrai SGBD ^^

    Si vous voulez le meilleur temps, c'est à dire le temps min, la requete sera


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT id#nage 
    , min(temps_s)
    FROM `temps` 
    GROUP BY `id#nage`

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    |id_temps |id#nageur |id#competition |id#nage |temps_s
    ---------------------------------------------------------------------------------------------
    |1643 |VNX |201504_VERSAIL |100SF |53.81
    Vous avez donc des id qui sont alphanumériques, ce qui est une mauvaise idée !
    Quand le volume de données va augmenter de manière importante, vous allez voir rapidement les temps de réponse des requêtes chuter.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2015
    Messages : 7
    Points : 19
    Points
    19
    Par défaut
    @bstevy

    SGBD d'amateur pour amateur ...

    Mais c'est vrai que plusieurs chose semblent pas être au top...
    Gestion des temps un peu farffelue ... , pas de fonction analytiques... et si moi je vois ça ...
    Mais ce nest finalement pas un choix ... ca c'est imposé avec Joomla ...
    Mais en temps que GROS amateur, ca devrait quand même suffir.


    Merci pour l'aide, je n'avais pas bien capté les ordres de traitement et ne comprenais pas bien l'intérêt du min... utilisé hors GROUP BY...

    Merci!
    Vsiron

  5. #5
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2015
    Messages : 7
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Vous avez donc des id qui sont alphanumériques, ce qui est une mauvaise idée !
    Quand le volume de données va augmenter de manière importante, vous allez voir rapidement les temps de réponse des requêtes chuter.
    En effet, ca j'y avais pensé mais étant donné que cette base est très petite et qu'elle est alimentée manuellement, je me suis dit qu'en limitant le nombre de caractère des id, cela ne pèserait pas trop ...

    les id nageur sont des trigrammes
    les id des nage sont sur 5 caractère max et il n'y en a qu'une dixaine
    Les id competition devraient eux etre raccourcis ...

    Merci pour le conseil en tout cas !

    vsiron

  6. #6
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2015
    Messages : 7
    Points : 19
    Points
    19
    Par défaut
    Cela fonctionne impeccablement si je ne souhaite afficher que le temps minimum par discipline.
    Mais si je souhaite reprendre les autres informations de la table 'temps' comme l' id_temps qui me permettra d'aller rechercher d'autre info liées, ça ne retourne pas trop ce qu'il faudrait ... le min est ok mais le reste est repris du premier record rencontré dans la table ....

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT id#nage
    , id_temp 
    , min(temps_s)
    FROM `temps` 
    GROUP BY `id#nage`

    n'est pas suffisant...

    Je dois lui ajouter une condition qui lui dise que le temps_s = min(temps_s) ?

    C'est bizarre, je pensais que le reste des données suivrait la ligne sélectionnée...

    BàV,
    vsiron

  7. #7
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    Votre requete serait fausse avec n'importe quel autre SGBD

    essayer cela peut etre ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT id#nage
    , id_temp 
    , temps_s
    FROM `temps` A
    where exists (
    select 1 
    from `temps` B 
    where B.id#nage = A.id#nage
    group by B.id#nage 
    having A.temps_s = min(B.temps_s)
    )

  8. #8
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2015
    Messages : 7
    Points : 19
    Points
    19
    Par défaut
    Bonjour et merci pour votre aide !

    Je viens d'essayer en reformulant comme suit pour prendre l'id#competition pour récupérer par un LEFT JOIN les informations concernant la compétition, cela fonctionne :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT  `id#nage` ,  `id_temps` , `id#competition`,  `temps_s` 
    FROM  `temps` A
    WHERE EXISTS (
     
    SELECT 1 
    FROM  `temps` B
    WHERE B.`id#nage` = A.`id#nage` 
    GROUP BY B.`id#nage` 
    HAVING A.`temps_s` = MIN( B.`temps_s` )
    )

    Mais faut que jecomprenne... je retourne à mon SQL pour les nuls avant d'aller plus loin !

    Encore Merci !

    Vsiron

  9. #9
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    si vous avez des questions particulières, je veux bien y repondre

  10. #10
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2015
    Messages : 7
    Points : 19
    Points
    19
    Par défaut
    Merci bstevy !

    Question fort générale...

    Vaut il mieux attaquer une "VIEW" par le query ou alors faire un "JOIN" pour récupérer les infos liés dans d'autres tables ?

    Comment MySQL va-t-il travailler le plus vite ?

    La logique voudrait que la seconde solution soit plus rapide car je suppose que le join est un post traitement à la requète...Mais j'ai des doutes ...

    Bien à vous,

    vsiron

  11. #11
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    quand je disais "particulière" je sous entendais particulières à la requete que j'ai ecrite...

    Une vue n'est qu'une facon de stocker du code sql... donc si vous attaquez une vue, vous attaquez directement le code sql en fait.
    Je suis pas sur de bien comprendre votre question, mais je dirais que si vous etes dans ce cas :

    Une vue
    qui contient A join B

    Et une requete qui fait A join B

    C'est pareil de faire un select sur l'un ou l'autre...

    ca répond à votre problème ?

  12. #12
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2015
    Messages : 7
    Points : 19
    Points
    19
    Par défaut
    J'abusé.. sorry

    cela répond à ma question.

    BàV,
    Vsiron

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

Discussions similaires

  1. [XSL]Récupérer les 5 plus petites valeurs de 10 éléments
    Par muad'dib dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 02/03/2009, 18h04
  2. Afficher n plus petites valeurs
    Par nomade333 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 12/02/2009, 17h07
  3. [MySQL] Retourner les plus petites valeurs d'une table
    Par Albafika dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 27/10/2008, 18h38
  4. Initialiser un double à la plus petite valeur possible.
    Par Pierre8r dans le forum Général Java
    Réponses: 4
    Dernier message: 05/03/2008, 20h36
  5. [SQL] Sélectionner la plus petite valeur
    Par Gabout dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 30/04/2007, 10h36

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