Page 1 sur 1

Addition limité pour classemenent général

Posté : 21 févr. 2008, 12:51
par Sebe
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

Posté : 21 févr. 2008, 13:00
par Ryle
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]

Posté : 21 févr. 2008, 13:54
par Sebe
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 !

Posté : 22 févr. 2008, 16:06
par Maitrepylos
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

Posté : 23 févr. 2008, 11:25
par Sebe
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