2016-06-29 114 views
0

我试图弄清楚如何从SQL表中获取一行数。在我的情况下,我需要根据他/她的分数得到用户的排名。我有下面的代码将做到这一点,但是有没有更好的方法来帮助这只是一个查询?从SQL查询中获取一行数

$rank = 0; 
$username = $_SESSION['user']; 

    $query = "SELECT username, SUM(`score`) as total_score FROM answers GROUP BY username ORDER BY total_score DESC"; 
     if ($stmt = mysqli_prepare($connect, $query)) { 
       mysqli_stmt_bind_param($stmt); 
       mysqli_stmt_execute($stmt); 
       mysqli_stmt_bind_result($stmt, $uname, $score); 
         while (mysqli_stmt_fetch($stmt)) { 
          $user = $uname; 
          $rank++; 
            if ($user == $username) { 
             echo $rank; 
             break; 
             } 
           } 
           mysqli_stmt_close($stmt); 
         } 

回答

1

你可以从你的SQL取得名次

SELECT username, SUM(`score`) as total_score,@curRank := @curRank + 1 AS rank FROM answers,(SELECT @curRank := 0) GROUP BY username ORDER BY total_score DESC 


example 

select DONATUR,COUNT(DISTINCT AREA) ,@curRank := @curRank + 1 AS rank from funding,(SELECT @curRank := 0) r group by Donatur; 
+---------+----------------------+------+ 
| DONATUR | COUNT(DISTINCT AREA) | rank | 
+---------+----------------------+------+ 
| Mr.X |     3 | 1 | 
| Mr.Y |     1 | 2 | 
| Mr.Z |     2 | 3 | 
+---------+----------------------+------+ 
3 rows in set (0.00 sec) 
,如果你想在列表中只有一个用户,你可以像这样

mysql> select DONATUR,COUNT(DISTINCT AREA) ,@curRank := @curRank + 1 AS rank from funding,(SELECT @curRank := 0) r group by Donatur having DONATUR="Mr.Y"; 
+---------+----------------------+------+ 
| DONATUR | COUNT(DISTINCT AREA) | rank | 
+---------+----------------------+------+ 
| Mr.Y |     1 | 2 | 
+---------+----------------------+------+ 
1 row in set (0.00 sec) 

使用此查询

SELECT @curRank := @curRank + 1 AS rank,username,score from (select username,COUNT(DISTINCT score) AS score from answers group by username order by COUNT(DISTINCT score)) y,(SELECT @curRank := 0) r where username=?"; 
+0

谢谢,如何编辑此查询,如果我只是想吨他为一个用户排名?或者我必须通过所有用户进行查询? – mattjon

+0

一个yser表示第一个或其他用户 –

+0

已更新的答案请检查 –