2012-01-24 4 views
2

Base de données:Mysql position de rang

id first_name points 
1 Bob   12 
2 Jane    50 
3 Jack    2 
4 Bill    10 
5 Nick    62 
6 Kathy   18 
7 Steve   42 
8 Anne    52 

Script:

<?php 
$con = mysql_connect("localhost","root","lol"); 
if (!$con) 
    { 
    die('Could not connect: ' . mysql_error()); 
    } 

mysql_select_db("st", $con); 

$result = mysql_query("SELECT first_name,points, 
      @curRank := @curRank + 1 AS rank 
FROM  person p, (SELECT @curRank := 0) r 
ORDER BY points DESC"); 

while($row = mysql_fetch_array($result)) 
    { 
    echo $row['first_name'] . " " . $row['points']; 
    echo "<br />"; 
    } 

mysql_close($con); 
?> 

Qu'est-ce que je reçois;

Nick 62 
Anne 52 
Jane 50 
Steve 42 
Kathy 18 
Bob 12 
Bill 10 
Jack 2 

Maintenant, je dois ajouter au rang de position de l'utilisateur (quelque chose comme fonction haut) exemple:

Nick 62 Top 1 
Anne 52 Top 2 
Jane 50 Top 3 
Steve 42 Top 4 and so on..... 
Kathy 18 
Bob 12 
Bill 10 
Jack 2 

+0

Quelle est la question? En regardant votre SQL, je dirais que '$ row ['rank']' devrait contenir la valeur que vous êtes intéressé à imprimer. – flesk

+0

Qu'en est-il des personnes ayant le même nombre de points, devraient-elles être liées à un rang ou l'une plus élevée que l'autre? – bowlerae

Répondre

1
$position = 1; 
while($row = mysql_fetch_array($result)) 
    { 
    echo $row['first_name'] . " " . $row['points'] . " Top ".$position; 
    echo "<br />"; 
    $position++; 
    } 
+1

cela ne fonctionne pas toujours, si les résultats sont paginés, la position est réinitialisée à 1 au début de chaque page. – bowlerae

+0

@bowlerae oui, mais il n'y a rien sur la pagination dans cette question. Aussi, si 2 résultats ou plus ont le même rang Vous devez marquer quelque chose comme '1,2,3-5,3-5,3-5,6,7'. Mais il n'y a rien dans cette question aussi. N'essayez pas de trouver la difficulté dans une question facile :) De toute façon Vous pouvez éditer la première ligne et ajouter quelque chose comme '$ position = ($ page-1) * $ per_page + 1;' et mon code fonctionnera bien. Bonne journée. –

+0

Je suis curieux parce que j'ai besoin d'aide pour le classement et personne ne s'est penché là-dessus, je ne veux pas poser de nouvelle question et être déphasé parce que c'est essentiellement la même question. – bowlerae

0
<?php 
$con = mysql_connect("localhost","root","lol"); 
if (!$con) 
    { 
    die('Could not connect: ' . mysql_error()); 
    } 

mysql_select_db("st", $con); 

$result = mysql_query("SELECT first_name,points FROM person ORDER BY points DESC"); 

$rank=1; 
while($row = mysql_fetch_array($result)) 
    { 
    echo $row['first_name'] . " " . $row['points'] . " Top " . $rank++; 
    echo "<br />"; 
    } 

mysql_close($con); 
?> 
+1

cela ne fonctionne pas toujours, si les résultats sont paginés, le rang est réinitialisé à 1 au début de chaque page. – bowlerae

+0

Il n'y a aucune mention de pagination dans l'OQ, et la requête sans LIMIT claude l'exclut. Interroger avec 'FROM (SELECT @curRank: = 0)' a exactement le même effet que mon rang $ = 1. Merci pour la downvotation. –

0

Vous devriez envisager réellement extraire et l'impression du rang:

echo $row['first_name'] . " " . $row['points']. " Top {$row['rank']}"; 
+0

Mon mauvais, je ne l'ai pas remarqué. – TJL

-1
$top = 1; 
    while($row = mysql_fetch_array($result)) 
    { 
     echo $row['first_name'] . " " . $row['points']." TOP ".$top ; 
    echo "<br />"; 

    $top++; 
    } 
+0

cela ne fonctionne pas toujours, si les résultats sont paginés, alors top est réinitialisé à 1 au début de chaque page. – bowlerae

1

À partir de votre requête i ajouté TOP mot en utilisant la fonction CONCAT dans MySQL. Essayez ceci:

SELECT first_name, 
     points, 
     CONCAT('TOP ',@curRank := @curRank + 1) AS rank 
FROM  person p, (SELECT @curRank := 0) r 
ORDER BY points DESC"