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 MySQL sur plusieurs tables pour calculer des sommes


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2004
    Messages : 42
    Points : 20
    Points
    20
    Par défaut Requête MySQL sur plusieurs tables pour calculer des sommes
    Bonjour la communauté,

    Je bloque depuis plusieurs jours pour réaliser des statistiques. J'ai créé un site pour gérer mes parties de jeux de plateau via une saisie d'un catalogue de jeux de plateau et une saisie des parties réalisées. J'ai donc créé via MySQL plusieurs tables :
    bdd_plateau : id_plateau, nom_plateau (j'enregistre sur cette table tous les jeux de plateau)
    bdd_plateau_stat : id_stat, id_plateau, nbre_joueurs, id_lieu (j'enregistre ici les parties avec l'Id du jeu de plateau, le nombre de joueurs et l'endroit où ça s'est passé)
    bdd_plateau_joueurs : id_joueur, id_stat, score_joueur (j'enregistre les scores de chaque joueur pour chaque partie).

    A partir de ces tables, j'arrive à saisir mes parties via des formulaires en PhP et à afficher les résultats des parties. Maintenant, je souhaite pouvoir élaborer des statistiques sur le nombre de joueurs sur les parties, les lieux utilisés pour chaque jeu, etc. Le problème est que j'utilise une requête MySQL mais les résultats ne correspondent pas. Il doit y avoir quelque chose qui m'échappe.
    Lorsque je lance la requête ci-dessous qui devrait me permettre de calculer combien de joueurs différents ont joué à un jeu particulier, il m'indique un chiffre qui ne correspond pas au nombre attendu. Sans doute qu'il doit y avoir une explication très simple mais là, je ne vois pas... si quelqu'un peut m'éclairer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $req = mysql_query ("SELECT COUNT(a.id_joueur) AS total, a.id_stat, b.id_plateau, b.id_stat FROM bdd_plateau_joueurs a, bdd_plateaux_stat b WHERE b.id_plateau='$idplateau' AND a.id_stat=b.id_stat GROUP BY a.id_joueur");
    $total = mysql_result ($req, $zero, "total");
    echo '<p><b>'.$total.'</b> joueurs diff&eacute;rents ont jou&eacute; &agrave; '.$nomplateau.'</p>';

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Fais tes jointures avec JOIN et pas dans le WHERE de la requête.

    id_stat c'est le clef de quelle table ?

    Sinon peux-tu nous donner un jeu de données, le résultat attendu et le résultat obtenu ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2004
    Messages : 42
    Points : 20
    Points
    20
    Par défaut
    Merci pour ton message, Sabotage. Je vais tester ça.

    Pour la table "bdd_plateau", la clef est "id_plateau", pour la table "bdd_plateau_stat", la clef est "id_stat" et pour "bdd_plateau_joueurs", la clef est "id_stat_joueur".

    Je réalise le test et je vous fais un retour

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2004
    Messages : 42
    Points : 20
    Points
    20
    Par défaut
    Je viens de réaliser cette opération :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $req = mysql_query ("SELECT COUNT(a.id_joueur) AS total, a.id_joueur, a.id_stat, b.id_plateau, b.id_stat FROM bdd_plateaux_joueurs AS a INNER JOIN bdd_plateaux_stat b ON b.id_plateau='$idplateau' AND a.id_stat=b.id_stat");
    $total = mysql_result ($req, $zero, "total");
    echo '<p><b>'.$total.'</b> joueurs diff&eacute;rents ont jou&eacute; &agrave; '.$nom.'</p>';
    Ce qui me donne le nombre total de joueurs qui ont joué à un jeu en particulier. Pour l'exemple, il s'agit de Tiny Epic Quest et le résultat est de 16 ce qui correspond bien au nombre total de joueurs. Par contre, lorsque je souhaite savoir le nombre de joueurs différents, là, le chiffre n'est pas bon.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $req = mysql_query ("SELECT COUNT(a.id_joueur) AS total, a.id_joueur, a.id_stat, b.id_plateau, b.id_stat FROM bdd_plateaux_joueurs AS a INNER JOIN bdd_plateaux_stat AS b ON b.id_plateau='$idplateau' AND a.id_stat=b.id_stat GROUP BY a.id_joueur");
    $total = mysql_result ($req, $zero, "total");
    echo '<p><b>'.$total.'</b> joueurs diff&eacute;rents ont jou&eacute; &agrave; '.$nom.'</p>';
    Il m'indique ceci : "6 joueurs différents ont joué à Tiny Epic Quest" Or, en comptant manuellement, je trouve 10 joueurs différents. Je ne comprends pas comment il calcule les 6 joueurs, d'où vient ce chiffre ??
    Table bdd_plateau
    id_plateau 360
    nom_plateau Tiny Epic Quest

    Table bdd_plateaux_stat
    id_stat 1 6 12 45 36 58
    id_plateau 360 360 360 360 360 360
    nbre_joueurs 1 4 1 2 4 4

    Table bdd_plateaux_joueurs
    id_stat_joueur 1 12 13 14 15 60 75 76...
    id_stat 1 6 6 6 6 12 45 45...
    id_joueur 1 1 4 12 15 1 18 26...

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Pour avoir des éléments distincts, il faut utiliser DISTINCT.
    Quand tu fais un GROUP BY, toutes les colonnes non agrégés du SELECT doivent être indiquées dans le GROUP BY, sinon tu peux avoir des résultats inatendus.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2004
    Messages : 42
    Points : 20
    Points
    20
    Par défaut
    Merci pour les conseils, et, en effet, le DISTINCT est magique et m'a permis d'avoir le bon résultat. Par contre, j'ai repris mes anciennes formules pour mieux m'y retrouver. Au final, ça marche, je dirais que c'est l'essentiel pour moi !! La requête utilisée est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $req = mysql_query ("SELECT COUNT(DISTINCT a.id_joueur) AS total, a.id_joueur, a.id_stat, b.id_plateau, b.id_stat FROM bdd_plateaux_joueurs AS a, bdd_plateaux_stat b WHERE a.id_stat=b.id_stat AND b.id_plateau='$idplateau'");

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Mettre le jointure dans le WHERE ça a été banni en 1995.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Le gros inconvénient dans la jointure dans le where par rapport à la jointure par JOIN ce qu'il est facilement possible de faire n'importe quoi et de se retrouver avec la totalité des deux tables.
    Exemple : je veux filtrer sur les plateaux à 2 ou 4 joueurs :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT a.id_joueur, a.id_stat, b.nbre_joueurs, b.id_plateau
    FROM bdd_plateaux_joueurs AS a, bdd_plateaux_stat b 
    WHERE a.id_stat=b.id_stat AND (b.nbre_joueurs = 2 OR b.nbre_joueurs = 4)
    La même requête avec une toute petite erreur : j'oublie les parenthèses dans le where
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT a.id_joueur, a.id_stat, b.nbre_joueurs, b.id_plateau
    FROM bdd_plateaux_joueurs AS a, bdd_plateaux_stat b 
    WHERE a.id_stat=b.id_stat AND b.nbre_joueurs = 2 OR b.nbre_joueurs = 4
    Et hop ! on a perdu la jointure.

    Bon là c'est évident, mais quand tu construis la partie where dynamiquement en fonction d'un formulaire de recherche, ça peut vite virer au bazar. Et lorsqu'une des deux tables fait 125 millions de lignes, qu'au lieu des 10 lignes qui t'intéressait tu as la totalité de la table qui remonte, je te laisse imaginer le résultat

    A lire sur les jointures : Le SQL de A à Z - le SELECT sur plusieurs tables

    Et au passage, l'API mysql (les fonctions mysql_xxxxx) est obsolète depuis PHP 5.5 et supprimée en PHP 7. Il faut passer à PDO (ou mysqli, mais j'aime moins mysqli)
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Mettre le jointure dans le WHERE ça a été banni en 1995.
    C'est la norme SQL 1992 qui a différencié les critère de filtrage (WHERE) de ceux de jointure (JOIN) :
    Pour autant l'ancienne syntaxe reste valide bien que peu recommandée puisqu'elle mélange deux concepts pourtant bien distincts.
    Ce qui est regrettable c'est que certains enseignants ignorent encore la norme de 1992

  10. #10
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2004
    Messages : 42
    Points : 20
    Points
    20
    Par défaut
    Merci pour vos remarques. Je vais tenter de me mettre à jour au niveau des normes mais ce n'est pas simple de changer des habitudes. Par contre, je me suis mis au php, il y a moins de 10 ans en puisant sur Internet pour me documenter, je n'ai aucune formation en informatique initialement et, du coup, je trouve ça étonnant que j'ai intégré des normes qui ne sont plus en vigueur depuis si longtemps... Certains sites de formation devraient se mettre à jour !!

    Bien à vous

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

Discussions similaires

  1. problème pour requête SELECT sur plusieurs tables
    Par 3dagard dans le forum Requêtes
    Réponses: 15
    Dernier message: 18/08/2008, 00h34
  2. [SQL] requêtes SQL sur plusieurs tables
    Par zahiton dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 24/11/2005, 16h32
  3. Encore une requête complexe sur plusieurs tables
    Par DenPro dans le forum Langage SQL
    Réponses: 5
    Dernier message: 09/12/2003, 19h05
  4. Requête complexe sur plusieurs table
    Par DenPro dans le forum Langage SQL
    Réponses: 13
    Dernier message: 25/11/2003, 17h50
  5. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26

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