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 :

Calculer un classement


Sujet :

Requêtes MySQL

  1. #1
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 385
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut Calculer un classement
    Bonsoir,

    j'ai ce genre de tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE IF NOT EXISTS `chronopc0` (
      `Id` int(11) NOT NULL AUTO_INCREMENT,
      `Heure` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
      `Dossard` smallint(6) NOT NULL,
      `Suite` enum('OK','ABANDON','SOS') CHARACTER SET latin1 NOT NULL,
      PRIMARY KEY (`Id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=163 ;
    et je voudrais lui ajouter une colonne qui contiendrait le rang de chaque coureur. Au début, j'avais imaginé un algorithme (qui est assez compliqué) pour faire ça en PHP, mais il doit y avoir moyen de calculer ce rang avec une requête SQL, mais laquelle (vu que je suis beaucoup moins expérimenté en SQL) ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  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
    Tu ne précises pas le SGBD que tu utilises...

    Avec un SGBD connaissant les fonctions de regroupement analytiques, il suffit de faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT  ID
        ,   dossard
        ,   heure
        ,   RANK() OVER (ORDER BY heure) AS ordre
    FROM    chronopc0
    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
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 385
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Le SGBD, c'est MySQL. Et si je fais SELECT Id,Dossard,Heure,RANK() OVER (ORDER BY Heure) AS ordre FROM chronoPC0
    You have an error in your SQL syntax
    alors qu'avec SELECT Id,Dossard,Heure FROM chronoPC0 pas de problème.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Quelque chose comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE VIEW v_chronoPC0 (Id, Dossard, Heure, Suite, Rang)
    AS
      SELECT t1.Id, t1.Dossard, t1.Heure, t1.Suite, COUNT(*)
        FROM chronoPC0 as t1
             INNER JOIN chronoPC0 as t2
               ON t2.Heure <= t1.Heure
    GROUP BY t1.Id, t1.Dossard, t1.Heure, t1.Suite;

  5. #5
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Il s'agit de MySQL.

    Avec MySQL, on peut gérer un auto-incrément dans le jeu de résultat.

    Donc ça sera tous simplement :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT auto_increment, Id,Dossard,Heure FROM chronoPC0 order by heure

    Reste plus qu'à trouver le code pour faire l'auto-incrément, je ne l'ai pas en tête.
    A noter cependant que ça ne tiendra pas compte d'éventuels ex-équo
    On ne jouit bien que de ce qu’on partage.

  6. #6
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    De mémoire, c'était plus simple ça que, mais essaie ça :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select @rank := rank + 1 rang, c.id, c.dossard, c.heure
    from chronopc0
    cross join (select @rank := 0)
    order by c.heure desc

    En t'inspirant de la dernière requête du lien ci-dessous (merci aux modérateurs de le laisser au moins le temps que l'intéressé le lise, je sais que c'est pas un lien permanant) tu pourras gérer les personnes qui arrivent en même temps.

    http://jimlife.wordpress.com/2008/09...wnum-in-mysql/
    On ne jouit bien que de ce qu’on partage.

  7. #7
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 385
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Pas le temps de regarder le lien tout de suite (mais comme il n'est pas permanent (ça existe ça ??), je l'ai mis dans mes favoris), et j'ai quand même pris le temps d'essayer les 3 requêtes conseillées (2 par Stringbuilder et 1 par Waldar), et 2 messages d'erreur et une page blanche...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  8. #8
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Quelque chose comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE VIEW v_chronoPC0 (Id, Dossard, Heure, Suite, Rang)
    AS
      SELECT t1.Id, t1.Dossard, t1.Heure, t1.Suite, COUNT(*)
        FROM chronoPC0 as t1
             INNER JOIN chronoPC0 as t2
               ON t2.Heure <= t1.Heure
    GROUP BY t1.Id, t1.Dossard, t1.Heure, t1.Suite;
    C'est ça, il faut juste aliasser la colonne de COUNT(*) et faire un ORDER BY cet alias.
    Cette méthode a l'avantage de gérer les ex-aequo.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  9. #9
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 385
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Merci pour la réponse ; je suis épaté de votre niveau en SQL (je ne sais même pas ce qu'est une jointure...) ; mais si j'essaye la requête telle quelle, page blanche
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  10. #10
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Là on t'a fourni une requête qui crée une vue (VIEW) après il faut faire une requête SELECT directement sur cette vue.
    Ou alors tu te passes de la vue et tu n'utilises que le code qui commence à SELECT.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  11. #11
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 385
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    T'as raison ; merci beaucoup.

    Et qu'est-ce que tu voulais dire :
    C'est ça, il faut juste aliasser la colonne de COUNT(*) et faire un ORDER BY cet alias.
    ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  12. #12
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Ça
    Code MySQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE VIEW v_chronoPC0 (Id, Dossard, Heure, Suite, Rang)
    AS
      SELECT t1.Id, t1.Dossard, t1.Heure, t1.Suite, COUNT(*) as rang
        FROM chronoPC0 AS t1
             INNER JOIN chronoPC0 AS t2
               ON t2.Heure <= t1.Heure
    GROUP BY t1.Id, t1.Dossard, t1.Heure, t1.Suite
    ORDER BY rang;
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

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

Discussions similaires

  1. [MySQL] Faire une table classement ou calculer le classement à chaque fois?
    Par Snipy dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 21/09/2010, 17h45
  2. Calcul du classement d'équipes de football
    Par patrick2010 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 28/02/2010, 22h49
  3. [CR XI] Calcul d'un classement/rang
    Par silversatch62 dans le forum SAP Crystal Reports
    Réponses: 8
    Dernier message: 06/08/2009, 11h29
  4. [MySQL] Calcul de classement
    Par Seb33300 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 15/06/2007, 15h06
  5. Calcul du classement d'équipes de football
    Par speedster dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 22/01/2007, 21h19

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