2010-12-08 21 views
3

J'ai une table USER, qui a les champs userId et point. À l'exécution, je veux savoir ce qu'est un classement d'une base d'utilisateurs particulière sur leur point. Quelle est la meilleure façon d'accomplir ceci:
1: Interrogez tous les utilisateurs dans une liste. Triez la base de liste sur le point et faites une recherche binaire pour trouver le classement de cet utilisateur. Cela ressemble à une mauvaise idée ici.
2: Est-il possible d'accomplir ces tâches en créant des requêtes de base de données?Qu'est-ce qu'un bon design pour le système de classement

Je prévois 2000-5000 utilisateurs.

+1

Je pense que vous devez reformuler ceci. Comment définissez-vous ce que «rang» signifie dans votre système? –

+0

@Peter: Je m'attendrais à ce que le rang soit le numéro de l'entrée de l'utilisateur dans la liste d'utilisateurs par 'point'. – Vlad

+1

@Harry: peut-être quelque chose comme 'select rn from (sélectionnez userId, point, row_number() sur l'ordre par le point desc en tant que USER) où userId =" quelquechose ";'? (Je ne suis pas vraiment bon dans la syntaxe SQL) – Vlad

Répondre

5
SET @rownum := 0; 

SELECT rank, userId, point 
FROM (
     SELECT @rownum := @rownum + 1 AS rank, userId, point 
     FROM user ORDER BY point DESC 
    ) 
as result WHERE userId = xxxxxxxx 
+0

Merci. Pourriez-vous m'expliquer un peu comment vous calculez la variable 'rank' de votre code? Le code ci-dessus, est-ce la syntaxe mysql? Juste que je ne vois jamais 'SET @rownum: = 0;' avant. +1 –

+0

Bien sûr, vous triez votre table selon le bon point. Et puis ce que vous voulez, c'est obtenir le numéro de ligne pour chaque enregistrement. La variable '@ rownum' fait exactement cela. A la fin vous obtenez l'enregistrement pour votre userid particulier =) –