[英]How can we rank by sum of score on mySQL and PHP
| id | fb_uid | fb_full_name | ---------------------------- | 1 | 101 | user_101 | | 2 | 102 | user_102 | | 3 | 103 | user_103 | | 4 | 104 | user_104 |
| 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: How can we result as: MySQL 和 PHP:我们如何得出以下结果:
| Rank | Name | score | ------------------------------ | 1 | user_103 | 500 | | 2 | user_104 | 450 | | 3 | user_101 | 400 | | 4 | user_102 | 200 |
Try this:尝试这个:
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
You should try this:你应该试试这个:
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;
This is pure SQL.这是纯 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
If two players have the same score they get the same rank and the next rank will be skipped eg如果两个玩家的分数相同,他们将获得相同的排名,下一个排名将被跳过,例如
1 user1 500
2 user2 400
2 user3 400
4 user4 300
But it's much easier to rank the users in PHP with但是使用 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
and something like和类似的东西
$users = array();
$i = 0;
while ($row = $result->fetchAssoc()) {
$row['rank'] = ++$i;
$users[] = $row;
}
or或者
$users = array();
$lastScore = null;
$lastRank = 1;
$rank = 0;
while ($row = $result->fetchAssoc()) {
++$rank;
if ($row[score] !== $lastScore) {
$lastRank = $rank;
}
$row[rank] = $lastRank;
$users[] = $row;
}
You have to use JOIN in your query as below :您必须在查询中使用 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;
See the implementation of your example over here.在此处查看示例的实现。
http://sqlfiddle.com/#!9/7482f/9 http://sqlfiddle.com/#!9/7482f/9
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.