Aller au contenu

formule de calcul classement mysql [resolu]


jer666

Messages recommandés

Posté(e)

bonjour,

j'ai un projet qui me trotte depuis un bail maintenant, et pour le réaliser j'aurais besoin de comprendre comment ordonner les résultats d'une requette selon une formule de calcul.

En clair:

imaginons une table nommée article

avec comme champs

id

titre

contenu

vote (1seule vote possible, on vote positif si on aime, si on aime pas on vote pas :))

date (de publication)

lecture

imaginons maintenant que j'attribu une note au champs vote, date et lecture.

par exemple

admettons

Qu'un vote equivaut a 1 point.

Qu'un article du jours equivaut a 50 point et qu'il regresse de 15 point par jours

Que 500 lectures equivaut a 1 point

comment former ma requette mysql dans mon script en php pour ordonner mes articles du plus gros nombre de point vers le plus bas?

en fait c'est une sorte de systeme a la digg ou scoopeo que je cherche a réaliser :)

si vous avez une explication, un tuto en francais? je suis preneur :transpi: merci par avance :fumer:

j'ai cherché mais comme je connais pas les bons termes c'est asp evident :eeek:

Posté(e)

Deux posibilités :

- Ajouter une colonne à ta table, pour contenir le score, qui serait actualisée régulièrement (au moins une fois par jour pour les -15pts, et à chaque vote). Ta requête serait ensuite super simple.

- Requêter une procédure stockée qui calculerait le score à la volée

Par contre, une unique requête qui calculerait tout ça sans rien stocker en base me paraît impossible.

Posté(e)

merci pour ta réponse :)

par contre j'avous ne pas avoir trop compris ce que tu entends par "Requêter une procédure stockée qui calculerait le score à la volée" si tu pouvais un peu developper? merci beaucoup sentinel

Posté(e)

Je pensais que tu pourrais développer une procédure stockée sur ta base (une sorte de fonction de calcul et de requêtage, hébergée par ta base), qui calculerait dynamiquement le score, et l'appeler au lieu d'effectuer une requête normale.

Oracle le permet, PostgreSQL aussi, mais je ne sais pas si mySQL dispose de cette fonction.

Posté(e)

SELECT *, vote+lecture/500+50-15*DATEDIFF(CURRENT_TIMESTAMP,date) AS Score
FROM ta_table
ORDER BY Score DESC

a supposé bien sur que ton lecture soit incrémenté à chaque lecture

Posté(e)

Du point de vue des perfs, je pense qu'une colonne dédiée au score serait meilleure.

Mais sinon, bien vu pour la formule inline, bien que cette méthode montre rapidement ses limites si les règles deviennent un peu complexes.

Posté(e)

(je n'avais pas vu ta réponse :x , MySQL permet aussi de stocker des procédures, pour info)

Oui, une colonne dédié sera plus rapide, forcément :) ; juste un léger souci il me semble, le score est calculé en fonction de la date, résultat tu dois mettre à jour ton score à minuit. A ma connaissance, on ne peux pas déclencher de procédure à un instant donnée, directement dans MySQL (je ne pense pas non plus dans les autres :yes: ), donc tu dois avoir recours à une solution tierce dans le cas d'une colonne calculée. Avec la gestion des erreurs qui va avec.

Et vu le calcul dans ce cas là, ça prend pas énormément de ressource :)

Après, chacun vois midi à sa porte :roll:

Posté(e)

merci a tout les 2 :transpi: je pense que la solution de spaz est la plus comprehensible et la plus simple :) merci beaucoup a vous 2 j'ai enfin un apperçu d'ensemble et relativement complet des possibilités ;)

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...