problème de jointure de table avec SUM et GROUP BY

waterjetmedia

Nouveau WRInaute
Bonjour,

Je m'occupe du site d'un club de foot et j'aimerais afficher les 5 meilleurs buteurs du club pour la saison en cours et pour cela je dois joindre les informations contenues dans 4 tables que je résume pour faire simple:

- players (player_id, player_lastname, player_firstname)
- calendrier (calendrier_id, datedumatch, saison_id, adversaire)
- saison (saison_id, saison_name, saison_start, saison_finish
- stats (stats_id, buts, player_id, calendrier_id)

à l'heure actuelle j'arrive à afficher les 5 meilleurs buteurs... mais de l'histoire en faisant ma requête uniquement sur la table stats. J'arrive à récupérer le player_id et le nombre de buts inscrits au total.

Ma requête actuelle :

<?php
$req = mysql_query("SELECT SUM(stats.stat_B) as buts, stats.player_id FROM stats GROUP BY player_id ORDER BY buts DESC limit 5");
?>

J'affiche mes résultats de cette manière (sans l'html dans mon exemple pour simplifier)

<?php while($reponse = mysql_fetch_array($req)){ ?>
<?php echo $reponse['player_id'].' : '.$reponse['buts'].'<br>';?>
<?php } ?>

Mais mon résultat bah c'est le player_id et son total de buts, toutes saisons confondues.

Idéalement j'aimerais afficher les 5 meilleurs buteurs pour la saison en cours avec leur nom et leur total de buts, mais jignore comment joindre ces tables là. J'ai essayer de faire un truc du style WHERE players.player_id LIKE stats.player_id mais ça ne fonctionne pas.

Quelqu'un a-t-il une idée ?
 

erestrebian

WRInaute occasionnel
Code:
$sql="select p.player_lastname, p.player_firstname, count(buts)
from players p, calendrier c, saison s, stats st
where p.player_id=st.player_id
and st.calendrier_id=c.calendrier_id
and c.saison_id=s.saison_id
and saison_start<".time()."
and saison_finisth>".time()."
order by count(buts) DESC
limit 0,5";

je pense que ça devrait ressemble à quelque chose comme ça mais bon je suis pas vraiment sûr de ce que contient exactement tes champs...
 

nickargall

WRInaute accro
Bonjour
je te laisse écrire les SELECT ;)
Code:
$query="SELECT SUM(stats.stat_B) as buts, ... WHERE `players.player_id`=`stats.player_id` AND
 `stats.calendrier_id`=`calendrier.calendrier_id` AND 
`calendrier.saison_id`=`saison.saison_id` AND `saison.saison_id`='".$variable_identifiant_saison."' ORDER BY buts DESC LIMIT 0,5";
$req = mysql_query($query);
peut être ?
ps : en passant la requete dans une variable, tu peux ensuite facilement l'afficher via un ECHO et la reprendre directement dans ton phpmyadmin qui te donnera plus d'infos sur ce qui va pas.
Me connaissant, m'étonnerait que ma proposition fonctionne mais peut-être te donnera-t-elle une piste ?

Sinon, je suis ouvert aux échanges de liens football avec mon www :)
Bon ok je :arrow:

EDIT : argh grillé, mais nos deux versions se rejoignent :)
RE-EDIT : la proposition de estrebian est meilleure, elle va chercher le nom des buteurs.
 

waterjetmedia

Nouveau WRInaute
erestrebian a dit:
Code:
$sql="select p.player_lastname, p.player_firstname, count(buts)
from players p, calendrier c, saison s, stats st
where p.player_id=st.player_id
and st.calendrier_id=c.calendrier_id
and c.saison_id=s.saison_id
and saison_start<".time()."
and saison_finisth>".time()."
order by count(buts) DESC
limit 0,5";

je pense que ça devrait ressemble à quelque chose comme ça mais bon je suis pas vraiment sûr de ce que contient exactement tes champs...

count(buts) ? pas SUM(buts) ?
 

waterjetmedia

Nouveau WRInaute
J'ai essayé la chose suivante et à présent, plus rien ne s'affiche :)

j'ai essayé juste de joindre stats et players comme table. en fait le champ pour mes buts c'est "stat_B" et non "buts"

<?php
$req = mysql_query("SELECT players.player_lastname,
players.player_id,
stats.player_id,
SUM(stat_B) as buts
FROM stats, players
WHERE stats.player_id = player.player_id
GROUP BY player_id
ORDER BY buts DESC
limit 5");
?>
 

waterjetmedia

Nouveau WRInaute
je viens d'essayer la proposition de eestrebian que je remercie, j'ai toujours rien qui s'affiche :(

je vais aller voir pourquoi... et je vous tiens au jus dans les min qui suivent

un immense merci à vous deux
 

chtipepere

WRInaute occasionnel
Exécute tes requêtes dans phpmyadmin, et pas par php, tu gagneras du temps pour debugger.
Pour la jointure (si ta version de mysql est supérieure à 3), utilises plutôt JOIN (INNER, LEFT ou RIGHT selon tes besoins).
Explications ici.

Bon courage
 

jamalofski

WRInaute discret
essaye ca :

Code:
SELECT players.player_lastname, players.player_firstname, sum(stats.buts) as totalButs 
FROM stats, players 
WHERE stats.player_id = player.player_id 
GROUP BY players.player_lastname, players.player_firstname
ORDER BY totalButs DESC 
limit 5
 

waterjetmedia

Nouveau WRInaute
hello,

alors ça a fonctionné de la manière suivante :

SELECT * , SUM( stat_B ) AS buts
FROM stats, players, schedule, seasons
WHERE stats.player_id LIKE players.player_id
AND stats.schedule_id LIKE schedule.schedule_id
AND seasons.season_id LIKE schedule.season_id
AND seasons.season_current LIKE '1'
GROUP BY stats.player_id
ORDER BY buts DESC
LIMIT 5

un immense merci à vous tous. Super classe ce forum que je ne connaissais pas.
 

nickargall

WRInaute accro
Tant mieux. Euh, pouruqoi "LIKE" et pas "=" dans tes requêtes ? A mon avis demander de "=" au lieu des "LIKE" marchera aussi bien et demandera moins de ressources à la base SQL
 

Discussions similaires

Haut