繁体   English   中英

我们如何按 mySQL 和 PHP 的总分排名

[英]How can we rank by sum of score on mySQL and PHP

表:tbluser

| id | fb_uid | fb_full_name |
 ----------------------------
| 1  |  101   |   user_101   |
| 2  |  102   |   user_102   |
| 3  |  103   |   user_103   |
| 4  |  104   |   user_104   |

表:userscore

| id | user_id | cat_id | score |
  -------------------------------
 | 1  |    101  |    1   |  100  |
 | 2  |    102  |    1   |  200  |
 | 3  |    101  |    2   |  300  |
 | 4  |    104  |    1   |  450  |
 | 5  |    103  |    1   |  500  |
  -------------------------------

MySQL 和 PHP:我们如何得出以下结果:

| Rank | Name          | score |
 ------------------------------
|  1   | user_103      |  500  |
|  2   | user_104      |  450  |
|  3   | user_101      |  400  |
|  4   | user_102      |  200  |

尝试这个:

SELECT 
    @rank := @rank + 1 AS Rank,
    u.fb_full_name,
    SUM(us.score) AS new_score
FROM userscore us INNER JOIN tbluser u ON us.user_id = u.id
    CROSS JOIN (SELECT @rank := 0) param
ORDER BY new_score DESC

你应该试试这个:

SELECT @r := 0;    

SELECT @r := @r + 1 AS Rank,u.fb_full_name AS Name,SUM(us.score) AS Score
FROM userscore as us 
INNER JOIN tbluser as u ON us.user_id = u.fb_uid 
ORDER BY new_score DESC;

这是纯 SQL。

select count(us2.user_id)+1 rank, u.fb_full_name, us.score
from tbluser u
join (
    select user_id, sum(score) score
    from userscore
    group by user_id
) us on us.user_id = u.fb_uid
left join (
    select user_id, sum(score) score
    from userscore
    group by user_id
) us2 on us2.score > us.score
group by u.fb_full_name, us.score
order by rank, us.user_id

小提琴 1小提琴 2

如果两个玩家的分数相同,他们将获得相同的排名,下一个排名将被跳过,例如

1 user1 500
2 user2 400
2 user3 400
4 user4 300

但是使用 PHP 对用户进行排名要容易得多

select u.fb_full_name, sum(us.score) score
from tbluser u
join userscore us on us.user_id = u.fb_uid
group by u.fb_full_name
order by score desc, u.id

和类似的东西

$users = array();
$i = 0;
while ($row = $result->fetchAssoc()) {
    $row['rank'] = ++$i;
    $users[] = $row;
}

或者

$users = array();
$lastScore = null;
$lastRank = 1;
$rank = 0;
while ($row = $result->fetchAssoc()) {
    ++$rank;
    if ($row[score] !== $lastScore) {
        $lastRank = $rank;
    }
    $row[rank] = $lastRank;
    $users[] = $row;
}

您必须在查询中使用 JOIN ,如下所示:

SELECT tbluser.fb_full_name, SUM(userscore.score) AS userscore FROM tbluser
JOIN userscore ON tbluser.fb_uid = userscore.user_id
GROUP BY tbluser.fb_uid
ORDER BY userscore DESC;

在此处查看示例的实现。

http://sqlfiddle.com/#!9/7482f/9

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM