Classement

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Classement

par Steffy » 05 oct. 2005, 00:33

Désolé pour cette faute d'orthographe cher ami :roll:

par Liquid » 05 oct. 2005, 00:11

Sinon Steffy, suis plutôt ma voie, car ma voix à cette heure là est assez médiocre :D .

par Liquid » 05 oct. 2005, 00:08

Précision par rapport au fait de ne pas stocker le classement dans la base. Ce système oblige à récupérer tous les enregistrements afin de pouvoir calculer le classement des uns par rapport aux autres. Par contre en stockant le classement on peut faire des requêtes avec une clause LIMIT sans avoir à faire de calcul. :idea:

par Steffy » 05 oct. 2005, 00:04

Merci Liquid je vais tenté de suivre ta voix...

par Liquid » 05 oct. 2005, 00:01

Pardon j'ai oublié le résultat que je voulais insérer :

Code : Tout sélectionner

Nom - Score - Date - Classement TOTO1 - 10 - 03/01/2005 - 1 TOTO2 - 5 - 02/01/2005 - 3 TOTO3 - 8 - 01/01/2005 - 2 TOTO4 - 5 - 01/01/2005 - 3

par Liquid » 04 oct. 2005, 23:59

Pour ce qui est de ne pas stocker un résultat dans une base de données, ça se discute car dans une application de gestion, par exemple un compte bancaire, on ne recalcule pas le solde en prenant en compte toutes les opérations à chaque ajout. On stocke le solde à chaque fois et on prend le dernier pour ajouter ou enlever la somme de la nouvelle opération. Sinon les calculs sont bien trop lourds.

A part ça je propose une solution avec un tableau qui servirait d'index des scores :
$resultat = array( // Simulation résultat BdD
	0 => array("TOTO1", 10, "03/01/2005"),
	1 => array("TOTO2", 5, "02/01/2005"),
	2 => array("TOTO3", 8, "01/01/2005"),
	3 => array("TOTO4", 5, "01/01/2005")
);
// Devrait être fait pendant la récupération des résultats dans la base :
$scoreIndex = array();
foreach ($resultat as $key => $value)
	$scoreIndex[] = $value[1];
// -- fin de la récupération des données dans la base
$scoreIndex = array_unique($scoreIndex); // Enlever les doublons
rsort($scoreIndex); // Tri décroissant
echo "Nom - Score - Date - Classement<br><br>";
foreach ($resultat as $key => $value){
	$pos = (array_search($value[1], $scoreIndex) + 1); // +1 car tableau indexé à partir de 0
	echo $value[0] . " - " . $value[1] . " - " . $value[2] . " - " . $pos . "<br>";
}

par Steffy » 04 oct. 2005, 23:53

Ben écoutez merci pour votre temps et vos idées :) je vais essayer de faire quelques test et je vous tiens au courant si j'avance...

Merci !

par Truc » 04 oct. 2005, 23:43

il faudrait un Gourou du SQL pour te répondre :-k
C'est vrai j'ai lachement jetté Steffy dans tes griffes en espérant que tu soit ce gourou :langue:

Mais bon l'idée du tableau tient debout, aller au boulot :ordi:

par Cyrano » 04 oct. 2005, 23:35

Pas nécessairement, tu n'as qu'une seule requête, le reste se fait par programmation. Il y aurait peut-être une astuce pour le classer directement lors de la requête SQL, mais je ne vois pas, il faudrait un Gourou du SQL pour te répondre :-k

par Steffy » 04 oct. 2005, 23:33

Oui merci cyrano j'en ai mal a la tête :shock: lol

c'est un casse tête mais quoi qu'il en soit en admettant que j'ai des centaines d'utilisateurs sur le dit site... ce genre de chose risque de faire beaucoup travailler mysql ?

par Cyrano » 04 oct. 2005, 23:26

Effectivement, je vois bien aussi le problème, mais pour l'astuce dans l'immédiat, je vois pas. À priori, il va falloir travailler avec des tableaux: enregistrer toutes les lignes dans un tableau multidimensionnel, classer ça par score, ajouter une élément de classement au tableau pour l'affichage , reclasser ensuite le tableau par dates et enfin afficher ça en page. Très grossièrement, c'est tout ce que je vois pour l'instant :-k

... à moins de récupérer les données classées dans la requête par SCORE et non par date, enregistrer ça dans un tableau, et effectuer un classement du tableau par date avant l'affichage. On ajouterait donc le classement à chaque nouvel ajout dans le tableau dlors de la récupération et on coupe une étape par rapport à l'idée suggérée au départ...

par Truc » 04 oct. 2005, 23:11

attends un peu avant de crée ton champ, je suis sur que Cyrano va revenir avec une belle astuce, moi je suis a sec :x (trop de BD pour une heure si tardive :wink: )

par Steffy » 04 oct. 2005, 23:07

Oui voilà je crois que tu as compris...c'est donc pourquoi je pensais qu'il faudrait ajouté cette valeur dans la table...et reclassé a chaque vote ce qui n'est pas "optimisé" comme le faisait remarqué plus haut Cyrano je crois.

par Truc » 04 oct. 2005, 23:03

enfait tu veut que l'affichage des données se fasse en fonction de la date MAIS que le classemant suit les point ?!

Hmm, dans ce cas le pointeur qui suit la boucle ne tient plus, sur le coup je vois pas d'alternative. :?

par Steffy » 04 oct. 2005, 22:54

Bah en faite voila un partie du code....
$DB->simple_construct( array( 'select' => 's.*,c.cat_name',
									  'from'   => 'tablesong s LEFT JOIN '.SQL_PREFIX.'tablecats c ON (s.cat_id=c.cat_id)',
									  'where'  => "s.s_open=1 AND s.cat_id".$ids,
									  'order'  => "s.post_date DESC",
									  'limit'  => array($first,25) ) );
											   
			$query=$DB->simple_exec();
                 $i =1;
			while ( $r = $DB->fetch_row($query) )
			{
                       $r['s_rank'] = $i++;

Le probleme c'est avec ca j'ai le tableau qui m'affiche donc dans la colone classement 1 2 3 dans l'ordre de DATE puisqu'il classé ainsi logique non ?)
NOM - SCORES - DATE - CLASSEMENT

TOTO - 10 - 03/01/2005 - 1
TOTO2 - 5 - 02/01/2005 - 2
TOTO3 - 8 - 01/01/2005 - 3


Seulement moi j'aimerais gardé exactement le meme affichage par date mais que la colone classement afiche le bon classement cad dans l'exemple il devrais affiché 1,3,2 (en fonction de la valeur des scores) est-ce que c'est plus clair ? :roll:

Désolé de vous prendre un peu la tête :oops: