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 :

selectionner les X meilleur enregsitrement


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de pimpmyride
    Inscrit en
    Décembre 2005
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 321
    Par défaut selectionner les X meilleur enregsitrement
    Bonjour,

    Je souhaite selectionner les 5 meilleures score de chaque personne dans une table, sachant que chaque personne peut avoir 0 ou n enregistrement.

    Je n'arrive pas a dire à mysql de prendre les 5 meilleurs enregistrements qu'il trouve et non pas le meilleur (fonction max).

    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 290
    Par défaut
    Si par exemple tu as une table Scores (IDpersonne, IDjeu, Score), cela te donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT S.IDpersonne, COUNT(*) AS Rang
    FROM Scores S
      INNER JOIN Scores S2 ON S.IDpersonne = S2.IDpersonne AND S.Score <= S2.Score
    GROUP BY S.IDpersonne
    HAVING COUNT(*) <= 5
    Explication : le rang d'un score est égal au nombre de meilleurs scores de la même personne + 1, par exemple mon 3ème score a deux scores meilleurs que lui. La condition de jointure S.IDpersonne = S2.IDpersonne AND S.Score <= S2.Score met en face de chaque score les scores supérieurs de la même personne, ainsi que lui-même (ce qui ajoute le +1).

    Les ex-aequos seront traités de différentes manière selon que tu utilises <= ou < et +1, etc.

  3. #3
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 062
    Par défaut
    Bonjour,

    La réponse du jour est : la division relationnelle.
    En reprenant le même schéma que celui proposé par Antoun, voilà ce que ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select s.IDPersonne, s.Score
    from scores s
    where (select count(*)
      from scores s2
      where s.IDPersonne = s2.IDPersonne
      and s.score < s2.score) < 5
    order by s.IDPersonne, s.Score desc
    Il y a un autre post récent qui parle de ça : requete sur 2 tables pour afficher 20 resultats par categorie.

    Attention, il faut que la version de MySQL soit au moins la 4.1, pour accepter les sous-requêtes

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  4. #4
    Membre éclairé Avatar de pimpmyride
    Inscrit en
    Décembre 2005
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 321
    Par défaut
    je vous remercie deja pour les réponses mais j'oublié une information importante.
    Il me faut en faite la somme des 5 meilleurs résultats par joueur, je viens d'essayer cela mais ca ne fonctionne pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT s.nick, s.points, sum(s.points) as TOTAL
    FROM score s
    WHERE (SELECT count(*)
               FROM score s2
               WHERE s.nick = s2.nick AND
               s.points < s2.points) < 5 AND
    ORDER BY TOTAL DESC
    une idée

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 062
    Par défaut
    Bonjour,

    Avec un AND juste avant le ORDER BY, pas surprenant que ça ne marche pas .
    As-tu essayé avec un GROUP BY, tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT s.nick, sum(s.points) AS TOTAL
    FROM score s
    WHERE (SELECT count(*)
               FROM score s2
               WHERE s.nick = s2.nick AND
               s.points < s2.points) < 5 
    GROUP BY s.nick
    ORDER BY TOTAL DESC
    Je n'ai pas testé, mais est-ce que ça peut aller ?

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  6. #6
    Membre éclairé Avatar de pimpmyride
    Inscrit en
    Décembre 2005
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 321
    Par défaut
    Ca me donne le meme résultat a savoir,

    -> une liste du plus grand score au plus petit en affichant qu'une seule fois le joueur.

    -> ta requete précédente affichait les meilleurs score des joueurs mais pas toujours les 5 c'etait un peu bizarre

    Le AND qui etait en trop est en faute une clause de date que je n'ai pas mis dans le post pour ne pas rendre la requete illisible.

Discussions similaires

  1. Selectionner les 5 meilleurs enregistrements
    Par Davboc dans le forum SQL
    Réponses: 6
    Dernier message: 12/09/2007, 22h24
  2. j'arrive pas a selectionner les champ d'un tableau a mysql
    Par ghita269 dans le forum Administration
    Réponses: 3
    Dernier message: 04/07/2006, 12h38
  3. Fichier séquentiel : garder les 5 meilleurs joueurs
    Par theterro dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 29/05/2006, 10h59
  4. [HTML] utiliser les DIV (meilleur que les tableaux?)
    Par atomic-greg dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 27/04/2006, 12h19
  5. Selectionner les date qui ont minimum une heure d'ecart
    Par uraxyd dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/07/2005, 13h39

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