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 :

[Requête] Classement d'une équipe par journée


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de cadoudal56
    Profil pro
    Inscrit en
    Février 2005
    Messages
    694
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 694
    Par défaut [Requête] Classement d'une équipe par journée
    Bonjour à tous et à toutes,

    Je me permet de poster mon probleme car cela fais 3 jours que je tourne en rond et je ne trouve pas la sortie... J'ai bien sur tenter de trouver une réponse sur le web, mais cela doit etre bien caché car je ne trouve pas...

    Cela va sembler banal pour certaines pointures du SQL, mais pour moi, ce n'est pas aussi simple qu'il n'y parait.

    Voici mon probleme...

    Je tente de créer un site sur des championnats sportifs
    J'ai une table que l'on va appeller classement, et qui contient des infos comme la journée, les points, l'ID de l'équipe etc....

    Pour sortir un classement je fais un SELECT tout bete avec les ORDER BY qui vont bien et qui me sors le classement des équipes de la 1ere à la dernière. Le classement se fait par points, puis à la différence de but et enfin par nombre de buts marqués.

    Je donne ici le nom des champs pour que l'on s'y retrouve mieux

    id_team => ID de l'équipe
    id_day => ID de la journée jouée
    pts => Points de l'équipe
    bp => Buts Placés (buts marqués)
    bc => Buts Concédés (buts pris)

    Voic mon probleme :
    J'aimerais sortir une requete qui me donne pour une équipe X son classement journée après journées (ie : Journée 1 => 3eme, journée 2 => 6eme, Journée 3 => 6ème, Journée 4 => 10ème etc...)

    J'ai trouvé un bout de requète que j'ai réadapté et qui ma foi fonctionne, mais qui n'est pas réaliste, c'est à dire que cela me remonte des trucs, mais c'est faux... C'est qu'il doit y avoir une erreur quelque part :

    Voici ce que j'ai :

    SELECT C1.id_team, count(C2.id_team) AS rang, C1.pts
    FROM classement AS C1
    JOIN classement AS C2 ON C1.pts <= C2.pts
    WHERE C1.id_team = 11
    AND C1.id_day = C2.id_day
    GROUP BY C1.id_day

    Ce que je n'arrive pas à faire, c'est avoir la bonne place de l'équipe dans le classement. Je me suis dis que c'est surement parce que dans le SELECT j'ai mes conditions dans le ORDER BY qui réorganise bien le tout, et que je ne les ai pas ici... Alors j'ai éssaye :

    SELECT C1.id_team, count(C2.id_team) AS rang, C1.pts
    FROM classement AS C1
    JOIN classement AS C2 ON C1.pts <= C2.pts AND (C1.bp - C1.bc) < (C2.bp - C2.bc)
    WHERE C1.id_team = 11
    AND C1.id_day = C2.id_day
    GROUP BY C1.id_day

    Mais cela me remonte des trucs encore plus fantaisiste.
    Bref je tourne en rond et je n'y arrive pas...
    Si une bonne ame charitable, experte en SQL pouvait m'aider....

    Merci d'avance

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Par défaut
    pts => Points de l'équipe
    bp => Buts Placés (buts marqués)
    bc => Buts Concédés (buts pris)
    Les pts dépendent-ils des bp et des bc ?

  3. #3
    Membre émérite Avatar de cadoudal56
    Profil pro
    Inscrit en
    Février 2005
    Messages
    694
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 694
    Par défaut concernant les points
    Bonjour,

    Non en fait, c'est comme du foot, un match gagné 3pts, 1 match nul 1 pt, 1 match perdu 0 pt.

    Mais je calcule les points avant dans un autre script, ce qui est rempli dans la colonne PTS c'est le total des points de l'équipe a la journée dites....

    si je prends le schméa suivant :

    Id_journée : id_team : pts : bp : bc

    3 : 11 : 12 : 5 : 3
    3 : 3 : 11 : 2 : 0
    3 : 8 : 16 : 5 : 4

    etc...

    Merci d'avance

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT C1.id_team, count(C2.id_team) AS rang, C1.pts
    FROM classement AS C1
    JOIN classement AS C2 ON C1.pts <= C2.pts
    WHERE C1.id_team = 11 
    AND C1.id_day = C2.id_day
    GROUP BY C1.id_day
    Cette requête est presque juste.
    Le problème se situe au niveau de GROUP BY.

    Pour avoir le classement par jour pour chaque équipe, il faut regrouper par équipe et par jour.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT C1.id_team, count(C2.id_team) AS rang, C1.pts
    FROM classement AS C1
    JOIN classement AS C2 ON C1.pts <= C2.pts AND C1.id_day = C2.id_day
    WHERE C1.id_team = 11
    GROUP BY C1.id_team, C1.id_day

  5. #5
    Membre émérite Avatar de cadoudal56
    Profil pro
    Inscrit en
    Février 2005
    Messages
    694
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 694
    Par défaut
    Merci jeremiya pour ta réponse, mais en fait c'est le classement pour chaque journée et pour une équipe.

    Le probleme peut se résumer ainsi :
    A quelle place dans le classement se situais l'équipe de Lorient (id_team = 11) lors de chaque journée...

    J'ai bien peur que le GROUP BY par id_team soit inutile car j'ai le
    WHERE C1.id_team = 11

    Ceci dit tu es peut etre sur de ton coup...

    Merci d'avance pour ta confirmation

    @+
    cadou

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Par défaut
    J'ai bien peur que le GROUP BY par id_team soit inutile car j'ai le
    WHERE C1.id_team = 11
    En effet, le GROUP BY id-team est inutile puisqu'il n'y a qu'une seule équipe.

    ce qui est rempli dans la colonne PTS c'est le total des points de l'équipe a la journée dites....
    Le classement d'une équipe pour une journée donnée est égale au nombre d'équipe dont la somme des PTS jusqu'à la journée donnée est supérieure à la somme des PTS (jusqu'à la journée donnée) de l'équipe donné.
    Il faut utiliser une somme, puisque PTS est le nombre de points obtenus pendant la journée et non depuis le début.

  7. #7
    Membre Expert
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Par défaut
    Citation Envoyé par cadoudal56
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ON C1.pts <= C2.pts AND (C1.bp - C1.bc) < (C2.bp - C2.bc)
    Pfiou, j'avais pas tiqué. Effectivement ça va coincer car c'est une expression logique donc il n'y a pas "d'ordre d'importance", juste des priorités entre les opérateurs. Ce qu'il faudrait c'est quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ON  C1.pts < C2.pts
    OR (C1.pts = C2.pts AND C1.bp-C1.bc < C2.bp-C2.bc)
    OR (C1.pts = C2.pts AND C1.bp-C1.bc = C2.bp-C2.bc AND C1.bp <= C2.bp)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ON  C1.pts < C2.pts
    OR (C1.pts = C2.pts
        AND (C1.bp-C1.bc < C2.bp-C2.bc
             OR (C1.bp-C1.bc = C2.bp-C2.bc AND C1.bp <= C2.bp)
             )
        )

  8. #8
    Membre émérite Avatar de cadoudal56
    Profil pro
    Inscrit en
    Février 2005
    Messages
    694
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 694
    Par défaut
    Merci sivrit !

    Ca marche nickel !!!
    Je suis trop content !!

    La soluce donne donc :

    SELECT C1.id_team, count(C2.id_team) AS rang, C1.pts
    FROM classement AS C1
    JOIN classement AS C2 ON C1.pts < C2.pts
    OR (C1.pts = C2.pts AND C1.bp-C1.bc < C2.bp-C2.bc)
    OR (C1.pts = C2.pts AND C1.bp-C1.bc = C2.bp-C2.bc AND C1.bp <= C2.bp)
    WHERE C1.id_team = 11
    AND C1.id_day = C2.id_day
    GROUP BY C1.id_day

    Un grand merci également a Jérémya pour s'etre penché sur le probleme et a qui je dois deux ou trois explication

    J'ai une crée une table match et une table classement pour plusieurs raisons...

    • Je voulais pouvoir avoir la possibilité de créer un graphique montrant l'évolution d'une ou deux équipes dans le championnat journée par journée et le faire a partir de la table des matchs m'aurait donné une requete de fou furieux.

    • Je voulais également pouvoir gérer l'affichage de mon classement journée après journée. Je l'ai fais avant d'avoir créer ma table classement et pour faire mes calculs je devais faire 6 requetes (match domicile gagnés, match domicile nul, match domicile perdu, match exterieur gagné, match exterieur nul, match exterieur perdu) puis appliquer les coeff de points. Bref tres gourmant en ressource

    • Je souhaite également que l'on puisse appeller un mini-classement a distance depuis d'autres sites et si je veux faire cela, il faut que la requete SQL soit très légère, càd un appel de 20 lignes plutot qu'un calcul sur une bonne centaine de lignes


    Maintenant il me reste a faire mon script avec mon graphique et grace a vous c'est réalisable...
    Après je m'attaque a un truc aussi compliqué...
    En affichant mon classement en faisant ma requete SELECT de base, réussir à déterminer quelle était la place dans le classement de l'équipe la journée précédente afin de pouvoir afficher une icone disant si le club a monté ou baissé dans le classement...

    Un grand merci en tout cas !!

    @+
    PS : Le but de tout cela vous l'aurez compris, est de réaliser un système PHP MYSQL permettant de gérer des championnats de sports collectifs type Foot, Hand, Basket, Hockey. Cela devrait sortir d'ici un ou deux mois j'espère et cela s'appellera surement PHPCompet. Je pense si il fonctionne bien le proposer sous licence GNU afin que les utilisateurs puisse le faire évoluer selon leurs désirs

  9. #9
    Membre chevronné
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Par défaut
    Je voulais pouvoir avoir la possibilité de créer un graphique montrant l'évolution d'une ou deux équipes dans le championnat journée par journée et le faire a partir de la table des matchs m'aurait donné une requete de fou furieux.
    C'est vrai, les requêtes auraient été très complexes.
    Mais n'est pas en faisant des requêtes complexes que l'on progresse en SQL ?

    En affichant mon classement en faisant ma requete SELECT de base, réussir à déterminer quelle était la place dans le classement de l'équipe la journée précédente afin de pouvoir afficher une icone disant si le club a monté ou baissé dans le classement...
    Comme maintenant tu as la requête donnant le classement selon la journée, tu peux ajouter une clause WHERE pour ne sélectionner qu'une journée particulière.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 10/08/2009, 14h08
  2. Réponses: 2
    Dernier message: 27/05/2009, 19h54
  3. classement d'une table
    Par manworms2 dans le forum C++Builder
    Réponses: 13
    Dernier message: 07/12/2008, 17h27
  4. Infrastructure pour une petite équipe
    Par vhmprg dans le forum EDI/Outils
    Réponses: 2
    Dernier message: 16/09/2008, 09h39

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