2016-03-28 2 views
-1

Таблица: 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: Как мы можем привести как:Как мы можем ранжировать по сумме баллов на MySql и PHP

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

Показать некоторые доказательства того, что вы были пойти на это - вы написали какой-либо код? Покажите это. –

+0

Что делать, если у двух пользователей одинаковая оценка? Как вы хотите лечить taht? –

ответ

0

Это чистый 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 

fiddle1fiddle2

Если два игрока имеют одинаковое количество очков они получают тот же ранг и следующий ранг будет пропущен, например,

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; 
} 
1

Попробуйте следующее:

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 
0

Вы должны попробовать это:

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; 
0

Вы должны использовать 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

Смежные вопросы