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

Langage SQL Discussion :

[MySQL] - Jointure et calcul de points


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 266
    Points : 98
    Points
    98
    Par défaut [MySQL] - Jointure et calcul de points
    Salut!
    Je vous sollicite de nouveau !
    Voilà mon souci:
    J'ai 4 tables users / pronos / events / matchs
    users >> id | username | boosters
    pronos >> match_id | user_id | bonus | points
    events >> id | factor
    matchs >> id | eq1 | eq2 | score_eq1 | score_eq2 | date

    La requête sql permet de donner le classement des joueurs pour l'ensemble des events selon la somme de points sur chaque prono.

    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
    20
    21
    22
    23
    24
    SELECT t.user_id AS user_pronos,
           u.avatar AS avatar,
           u.username AS membre,
           coalesce(t.sum_bonus,0) AS bonus,
           coalesce(t.sum_booster,0) AS booster_played,
           coalesce(t.sum_pt,0) + coalesce(t.sum_bonus,0) AS points,
           coalesce(t.best2,0) + coalesce(t.best3,0) AS best_point,
           coalesce(t.best3,0) AS best3
    FROM users u
    LEFT JOIN
      (SELECT user_id,
              sum(points) AS sum_pt,
                             sum(booster) AS sum_booster,
                                             sum(bonus_point) AS sum_bonus,
                                             ROUND(SUM(CASE WHEN points=($vic*events.factor) THEN points ELSE 0 END)/($vic*events.factor),0) AS best2,
                                             ROUND(SUM(CASE WHEN points=($vic*$booster_factor) THEN points ELSE 0 END)/($vic*$booster_factor),0) AS best3
       FROM pronos
       JOIN matchs ON matchs.id = pronos.match_id
       JOIN events ON events.id = matchs.event_id
       WHERE matchs.date < now()
       GROUP BY user_id ) t ON t.user_id = u.id
    WHERE u.access!=0
    ORDER BY points DESC,
             best_point DESC
    $vic est une variable php valant ici 3 et $booster_factor 4 (variables fixes).

    Le paramètre events.factor varie selon l'event.
    Le problème est pour le calcul du "best2". Best2 permet de compter le nombre de pronos ayant rapporté 3 * factor de chaque event.
    A priori, cette requête ne prend pas le factor de chaque event pour le calcul du best2.

    J'espère avoir été clair.

    Merci de votre aide précieuse !

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 266
    Points : 98
    Points
    98
    Par défaut
    A priori, le problème était là:

    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
    SELECT t.user_id as user_pronos, u.avatar as avatar, u.username as membre, coalesce(t.sum_bonus,0) as bonus,
    			coalesce(t.sum_booster,0) as booster_played, coalesce(t.sum_pt,0) + coalesce(t.sum_bonus,0) as points,
    			coalesce(t.best2,0) + coalesce(t.best3,0) as best_point, coalesce(t.best3,0) as best3
      			FROM users u
     
      			LEFT JOIN (SELECT user_id , sum(points) AS sum_pt, sum(booster) AS sum_booster, sum(bonus_point) AS sum_bonus,			
    			ROUND(SUM(CASE WHEN points=($vic*events.factor) THEN 1 ELSE 0 END),0) AS best2,
    			ROUND(SUM(CASE WHEN points=($vic*4) THEN 1 ELSE 0 END),0) as best3
     
    			FROM pronos
    			JOIN matchs on matchs.id = pronos.match_id
    			JOIN events on events.id = matchs.event_id
    			WHERE matchs.date < now()
             		GROUP BY user_id
           			) t
     
        			ON t.user_id = u.id
        			WHERE u.access!=0			
    			ORDER by points DESC, best_point DESC

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ROUND(SUM(CASE WHEN points=($vic*events.factor) THEN 1 ELSE 0 END),0) AS best2,

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

Discussions similaires

  1. [MySQL] Jointure et Sum
    Par dark_vidor dans le forum Langage SQL
    Réponses: 7
    Dernier message: 17/03/2006, 15h01
  2. [MySQL] Jointure correcte ?
    Par tochbee dans le forum Langage SQL
    Réponses: 3
    Dernier message: 31/01/2006, 11h56
  3. [MySQL] Jointure sur une table déjà jointe
    Par genova dans le forum Requêtes
    Réponses: 3
    Dernier message: 19/10/2005, 00h54
  4. [MySQL] - jointure de tables
    Par yelbied dans le forum Requêtes
    Réponses: 7
    Dernier message: 12/10/2005, 18h34
  5. calculs des points
    Par rabi dans le forum OpenGL
    Réponses: 11
    Dernier message: 12/02/2004, 11h03

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