problème de jointure de table avec SUM et GROUP BY
14 messages • Page 1 sur 1
Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics
- waterjetmedia
- Nouveau WRInaute
- Messages: 9
- Inscription: Jeu Sep 20, 2007 11:17
problème de jointure de table avec SUM et GROUP BY
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 ?
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 impliqué

- Messages: 394
- Inscription: Ven Juin 15, 2007 12:55
- Code: Tout sélectionner
$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

- Messages: 5319
- Inscription: Lun Juin 13, 2005 14:13
Bonjour
je te laisse écrire les SELECT
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
EDIT : argh grillé, mais nos deux versions se rejoignent
RE-EDIT : la proposition de estrebian est meilleure, elle va chercher le nom des buteurs.
je te laisse écrire les SELECT
- Code: Tout sélectionner
$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
EDIT : argh grillé, mais nos deux versions se rejoignent
RE-EDIT : la proposition de estrebian est meilleure, elle va chercher le nom des buteurs.
Dernière édition par nickargall le Jeu Sep 20, 2007 11:44, édité 1 fois.
- waterjetmedia
- Nouveau WRInaute
- Messages: 9
- Inscription: Jeu Sep 20, 2007 11:17
erestrebian a écrit:
- Code: Tout sélectionner
$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
- Messages: 9
- Inscription: Jeu Sep 20, 2007 11:17
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");
?>
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
- Messages: 9
- Inscription: Jeu Sep 20, 2007 11:17
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
je vais aller voir pourquoi... et je vous tiens au jus dans les min qui suivent
un immense merci à vous deux
- chtipepere
- WRInaute impliqué

- Messages: 484
- Inscription: Jeu Jan 08, 2004 16:15
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
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
- waterjetmedia
- Nouveau WRInaute
- Messages: 9
- Inscription: Jeu Sep 20, 2007 11:17
ok je vais lire les règles de join que tu m'as proposé et checker avec phpmyadmin
et ensuite... on verra
et ensuite... on verra
-

erestrebian - WRInaute impliqué

- Messages: 394
- Inscription: Ven Juin 15, 2007 12:55
c'est quoi stats_B dans ta table?
sinon c'est bien un sum et pas un count qu'il faut faire...
sinon c'est bien un sum et pas un count qu'il faut faire...
- jamalofski
- WRInaute discret

- Messages: 85
- Inscription: Sam Mar 03, 2007 16:51
essaye ca :
- Code: Tout sélectionner
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
- Messages: 9
- Inscription: Jeu Sep 20, 2007 11:17
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.
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

- Messages: 5319
- Inscription: Lun Juin 13, 2005 14:13
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
-

erestrebian - WRInaute impliqué

- Messages: 394
- Inscription: Ven Juin 15, 2007 12:55
si tu n'as pas besoin de tous les champs, sélectionne seulement sur ceux qui t'intéressent (nom, prénom...)
- waterjetmedia
- Nouveau WRInaute
- Messages: 9
- Inscription: Jeu Sep 20, 2007 11:17
ok, je vais essayer cela pour rendre plus léger ma requête.
merci
merci
14 messages • Page 1 sur 1
Formation recommandée sur ce thème :
Formation Référencement naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.
Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.
Lectures recommandées sur ce thème :
- Les pays gérés par la Google Toolbar 2.0
- Du nouveau du côté des laboratoires de Google : Google Labs
- Yahoo Slurp et autres robots d'indexation de Yahoo
- Accord entre Ask Jeeves et Google
- Services et outils de Yahoo! Search
- Parts de marché des moteurs aux USA (Octobre 2006)
- Les visiteurs de WRI apprécient Firefox
- MSN Search : Microsoft dans la course
- La détection des blog rolls dans Google Blog Search
- Google Calendar API
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités

le forum