2017-10-06 3 views
0

J'ai un système de classement, qui est le résultat basé sur des points.MySQL système de classement personnalisé requête

User | Points 
    1 | 100 
    2 | 197 
    3 | 123 
    4 | 174 
    5 | 98 
    ... 
    197 | 21 
    198 | 110 
    199 | 154 

Si l'on suppose que mon ID utilisateur est 197, donc je veux d'abord connaître mon rang basé ou des points, les points les plus élevés au premier, le plus bas enfin, donc supposons ici que mon rang (utilisateur-id = 197) Après avoir obtenu mon classement (si mon classement n'est pas dans la liste des 100 meilleurs), je veux obtenir la liste des 100 utilisateurs où je dois obtenir le 1er au 50e rang et le 125e au 175e rang. Je peux obtenir mon rang dans cette liste aussi, mais pour les rangs de la liste seront les rangs réels dans les résultats

User | Points | Rank 
18 | 199 | 1 
22 | 198 | 2 
31 | 180 | 3 
19 | 174 | 4 
51 | 168 | 5 
+ 
17 | 22 | 149 
197 | 21 | 150 
199 | 14 | 151 

J'ai l'application en PHP, alors quel est le meilleur moyen et efficace pour atteindre cet ensemble de résultats?

+5

Nous sommes toujours heureux d'aider et de soutenir de nouveaux codeurs, mais vous devez d'abord vous aider. : -) *** Après [** faire plus de recherche **] (https://meta.stackoverflow.com/q/261592/1011527) si vous avez un problème ** poster ce que vous avez essayé ** avec un ** explication claire de ce qui ne fonctionne pas ** et fournir [un exemple minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve). Lisez [Comment demander] (http://stackoverflow.com/help/how-to-ask) une bonne question. Assurez-vous de [faire le tour] (http://stackoverflow.com/tour) et lisez [this] (https://meta.stackoverflow.com/q/347937/1011527). –

Répondre

1

La requête globale pour le retour des scores avec leur grade serait (ou devrais-je dire « pourrait être », comme cela fonctionne, mais peut-être pas la plus élégante solution):

SET @count = 0; 
SELECT 
    user, 
    points, 
    rank 
    FROM( 
     SELECT user, 
       points, 
        @count := @count + 1 'rank' 
     FROM scores 
     ORDER BY points DESC 
    ) as ranks; 

Donc, si vous vouliez connaître le rang d'un utilisateur spécifique, vous ajouteriez une clause where à la fin, de:

WHERE user = 197; 

en ce qui concerne la deuxième partie, en particulier avec la mise en forme, je pense que c'est mieux fait en PHP. Vous pouvez exécuter ci-dessus pour obtenir votre « rang », puis faire quelque chose comme ça (note: Je suis pseudo citer PHP ici, plutôt que les scripts une réponse):

$myRank = [result of above query]; 

if($myRank > 100) { 

// retrieve first 50 results and display in query 1 

echo "..."; // or in a <td>, etc. 

// retrieve results x to y and display in query2, loop through a table etc. 

} 
else { 

// retrieve the first 100 if your score is in that range 

} 

SQL pour les 50 premiers résultats serait

SET @count = 0; 
SELECT 
    user, 
    points, 
    rank 
    FROM( 
     SELECT user, 
       points, 
        @count := @count + 1 'rank' 
     FROM scores 
     ORDER BY points DESC 
    ) as ranks 
    LIMIT 0,50; 

et vous auriez à utiliser la sortie de notre $myRank théorique en php pour obtenir la prochaine série de résultats. Par exemple, si vous vouliez le 50 suivant après votre rang, vous changeriez la dernière ligne:

LIMIT $myRank,$upper; 

où serait supérieur est, en php:

$upper = $myRank+50; 

Vous auriez besoin évidemment déterminez exactement ce que vous voulez réaliser en termes de différents scénarios avant de pouvoir réellement trouver une solution complète, mais j'espère que cela vous aidera.