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 :

Plusieurs SUM dans une requête


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 19
    Points : 12
    Points
    12
    Par défaut Plusieurs SUM dans une requête
    Salut à tous, j'aurais besoin d'aide pour une requête MySQL sur laquelle je m'arrache les cheveux depuis tout à l'heure...

    Voilà en fait il s'agit d'un site de jeux, comportant une table membres (avec login et ID) et plusieurs tables (une par type de jeu) où on stocke les points obtenus à chaque partie.

    Ce que j'aimerais faire c'est avoir une liste de membres avec une colonne par type de jeu dans laquelle on aurait le total des points obtenus par membre.

    Alors evidemment ma première idée a été d'utiliser un SUM comme ci dessous:
    SELECT idmembre, SUM(points) as points FROM `points1` GROUP BY idmembre");

    Jusque là tout va bien mais comment faire pour recuperer les totaux des autres tables dans la meme requete en regroupant toujours par idmembre?

    Ensuite un autre problème auquel je suis confronté est que dans ces tables de points, tous les membres ne sont pas référencés car n'ayant pas tous joué... Donc il faudrait en fait que je parcours la table membres (p-e en limitant a 50 resultats par page) et que pour chacun d'entre eux j'obtienne les totaux de points.... J'ai bien essayé mais là je sèche un peu, est-ce que qqn pourrait m'éclairer?

    Structure des tables de points:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE TABLE `points1` (
      `idmembre` int(11) NOT NULL default '0',
      `points` int(11) NOT NULL default '0'
    );
     
    CREATE TABLE `points2` (
      `idmembre` int(11) NOT NULL default '0',
      `points` int(11) NOT NULL default '0'
    );
     
    CREATE TABLE `points3` (
      `idmembre` int(11) NOT NULL default '0',
      `points` int(11) NOT NULL default '0'
    );
    Structure de la table membre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE TABLE `membres` (
      `IdMembre` int(11) NOT NULL auto_increment,
      `user` varchar(25) NOT NULL default ''
    )

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 739
    Points
    11 739
    Par défaut
    tu pars de ta table Membres et tu fais un LEFT OUTER JOIN vers chacune de tes tables Points.

    btw, une meilleure modélisation serait de n'avoir qu'une seule table Points, avec une colonne IDjeu.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    Hehe ok merci bien, je vais chercher dans la doc mysql quelques infos là-dessus

  4. #4
    Membre expérimenté
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Points : 1 351
    Points
    1 351
    Par défaut

  5. #5
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 739
    Points
    11 739
    Par défaut
    Citation Envoyé par pj69100
    Hehe ok merci bien, je vais chercher dans la doc mysql quelques infos là-dessus
    On va raccourcir les recherches :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT M.idmembre, SUM(P1.points) AS Score1, SUM(P2.points) AS Score2
    FROM Membres M
      LEFT OUTER JOIN Points1 P1 ON M.idmembre = P1.idmembre
      LEFT OUTER JOIN Points2 P2 ON M.idmembre = P2.idmembre
      ...
    GROUP BY M.idmembre

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

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Le résultat va être faux

    Si on fait un SUM c'est que l'on s'attend à avoir plusieurs entrées par membre dans les tables 'points_' et toute jointure va nous faire un beau produit cartésien de tout ça et fausser les résultats.

    Avec un MySQL assez récent il va falloir une sous requête par table de points. Ou alors réunir tous les points dans une table comme déjà suggéré, en utilisant un identifiant, numéro de série ou jeu ou quoi que ce soit. Après c'est affaire de SUM et de IF. Eventuellement, la table composée peut être créée virtuellement avec des UNION ALL (et peut-être une vue) mais c'est peut-être un peu tordu.

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 739
    Points
    11 739
    Par défaut
    oups ! tu as raison, j'ai lancé une combinatoire infernale...

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

Discussions similaires

  1. Envoyer plusieurs critères dans une requête ?
    Par olivierc25 dans le forum Access
    Réponses: 4
    Dernier message: 20/03/2007, 15h13
  2. plusieurs comptes dans une requête
    Par sopcc dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 16/01/2007, 10h50
  3. Sous-requête excutée plusieurs fois dans une requête
    Par sheridan31 dans le forum Oracle
    Réponses: 8
    Dernier message: 03/07/2006, 16h18
  4. [ACCESS2002][fonction sum dans une requête]
    Par louroulou dans le forum Access
    Réponses: 1
    Dernier message: 14/06/2006, 09h26
  5. Plusieurs jointures dans une requête sql
    Par Pero dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/09/2005, 20h59

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