2009-07-20 6 views
1

Hey, j'ai fait un système de notation en php et mysql et maintenant je veux sélectionner un top 5, J'ai fait quelque chose, mais si un utilisateur ajoute une note (avec le maximum) c'est le classement n ° 1.calculer un top 5 en php et mysql

Comment faites-vous les gars en php et mysql?

la table ressemble à ceci:

- id

- mi

- uid

- Classement

La note est un nombre de 1 à 5

Merci d'avance!

+0

Qu'est-ce que le milieu et l'uid? Suivez-vous le nombre de votes? Il suffit de compter un nombre minimum de votes pour être compté dans le top 5. – jimyi

Répondre

5

Comme @chaos rappelle, c'est l'idée:

SELECT `mid`, SUM(`rating`) AS `total` 
FROM `rating` 
GROUP BY `mid` 
ORDER BY `total` DESC 
LIMIT 5 

Cependant, pour faire en sorte que pas des articles avec très peu évaluation dans le top 5, vous pouvez ajouter un seuil, ce qui permet des articles seulement avec plus de notes X apparaissent dans le résultat, ce qui donne peut-être une image plus précise du top 5:

SELECT `mid`, SUM(`rating`) AS `total`, COUNT(1) AS `nrRatings` 
FROM `rating` 
GROUP BY `mid` 
HAVING nrRatings > 5 // This is the threshold. Only articles with more than 
        // 5 ratings will be considered 
ORDER BY `total` DESC 
LIMIT 5 
+0

'COUNT (*)', ou 'COUNT (rating)' si la notation est nulle, est plus idiomatique que 'SUM (1)'. – chaos

+0

Vous avez raison Chaos, a eu un moment de gel du cerveau, je pense – PatrikAkerstrand

2
SELECT `mid`, SUM(`rating`) AS `total` 
FROM `rating` 
GROUP BY `mid` 
ORDER BY `total` DESC 
LIMIT 5 
0

Si je comprends bien vos mots, ressemble à une note de 1 est le highe st? ORDER BY devrait alors être ASC. Je pense que AVG() serait plus approprié que SUM(). Totalement d'accord avec l'idée du seuil, donc quelque chose comme ça (éhonté c/p réécriture; thx @Machine: P):

 
SELECT `mid`, AVG(`rating`) AS `avg_rating`, SUM(1) AS `nrRatings` 
FROM `rating` 
GROUP BY `mid` 
HAVING nrRatings > 5 
ORDER BY `avg_rating` ASC 
LIMIT 5