Addition limité pour classemenent général

Mammouth du PHP | 545 Messages

21 févr. 2008, 12:51

Bonjour,

J'essaye de mettre un classement général au point mais j'ai un petit soucis pour limiter le nombre maximum de données à additionner !

Dans un 1er temps, j'ai créé un tableau avec plusieurs appels de fonction :
if ($runnerlist[0]->participant_id != '') {
	$i=0;
	foreach ($runnerlist as $runner){
		$scoreslist[$i]= array(
		'id' => $runner->participant_id,
		'annee' => $annee,
		'nom' => $runner->nom,
		'prenom' => $runner->prenom,
		'part_id' => $runner->part_id,
		'dossard' => $runner->dossard,
		'club' => $runner->club,
		'pat' => $pat = count_course($annee, $dossard = $runner->dossard, $pat_chal = 'P'),
		'chal' => $chal = count_course($annee, $dossard = $runner->dossard, $pat_chal = 'C'),
		'nbre' => $pat + $chal,
		'pointschal' => $ptchal = points($annee, $dossard = $runner->dossard),
		'points' => calcpts($pat, $chal, $ptchal),
		'categorie' => $runner->lastname); // dec_categorie());
		$i ++;
		}

	foreach ($scoreslist as $key => $row) {
    	$score[$key]  = $row['points'];
		}

	array_multisort($score, SORT_DESC, $scoreslist);
	} // fin du if $runnerlist
Où cela merdouille un peu c'est pour la fonction points():
function points ($annee, $dossard) {
	global $database;
	$countch = 10;

	$query = "SELECT SUM(clas.point) as somme, clas.dossard"    
		. "\n FROM #__classement AS clas"
    	. "\n INNER JOIN #__classement_course AS course ON course.id = clas.course_id"
		. "\n WHERE course.date LIKE '" . (int)$annee . "-%' AND clas.dossard = '" . (int)$dossard . "' AND course.pat_chal = 'C'"
		. "\n GROUP BY clas.dossard"
		. "\n ORDER BY clas.point DESC"
		. "\n LIMIT 0,10"
		;
	$database->setQuery( $query );
	$pointchal = $database -> loadResult();

	return $pointchal;
	}
J'ai tenté de limiter le calcul à un maximum de 10 meilleures scores mais il m'additionne tous les scores existant pour la personne ... est-ce un problème d'utilisation avec 'LIMIT' ?

Merci pour le tuyau
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

21 févr. 2008, 13:00

Le but de la fonction LIMIT est de "limiter" le nombre d'enregistrements retournés par la requête. Il ne s'agit nullement d'un critère de filtre des données utilisées tels que ceux que tu utilise dans ton WHERE.

En gros, tu fais la somme sur toutes les données (uniquement filtrées par ta clause WHERE), et tu retournes les 10 premières lignes de résultat...

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 545 Messages

21 févr. 2008, 13:54

Je ne comprends pas bien ce que je dois au juste faire ... comment puis-je récupérer les 10 meilleures scores ?

Merci

Edit:
Je me suis rendu compte que j'utilise LIMIT dans une autre requête qui fait aussi une addition et celle-là fonctionne !
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

Mammouth du PHP | 1029 Messages

22 févr. 2008, 16:06

Lis ce que Ryle te dit.

Dans une requête Mysql le LIMIT(), permet de retourner un nombre de résultats déterminé.

pour trouver ta solution il faut faire des tests.

Je ne sais si Mysql respecte les standards

mais quelque chose comme ça

Code : Tout sélectionner

WITH TABLESUM(TOTAL) AS ( SELECT clas.point FROM classement AS clas ORDER BY clas.point LIMIT 0,10 ) SELECT SUM(TOTAL) FROM TABLESUM
Te donneras le total des 10 plus grands score........normalement
L'expérience est la somme de toutes nos erreurs.

Mammouth du PHP | 545 Messages

23 févr. 2008, 11:25

Salut et merci pour vos réponses,

J'ai une solution sans 'LIMIT':
$query = "SELECT clas.point as somme"   
		. "\n FROM #__classement AS clas"
    	. "\n INNER JOIN #__classement_course AS course ON course.id = clas.course_id"
		. "\n WHERE course.date LIKE '" . (int)$annee . "-%' AND clas.dossard = '" . (int)$dossard . "' AND course.pat_chal = 'C'"
		. "\n ORDER BY clas.point DESC"
		;
	$database->setQuery( $query );
	$rows = $database -> loadResultArray();
	
	for ($i=0; $i<10; $i++) {
		$pointchal += $rows[$i];
		}
Et cela fonctionne comme il se doit ... par contre, je vais ouvrir un nouveau sujet pour m'aider à optimiser ma page qui est toujours très lente !

Encore merci
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!