根据总分和时间获取用户排名位置

时间:2019-02-25 18:59:00

标签: php laravel laravel-5 eloquent

我想基于总分和平均时间来获得用户排名位置。但是,我正在使用的查询给出了错误的职位编号。

$myId = TotalScore::where('user_id', $user_id)->first();
$position = TotalScore::where('ts', '>=', $myId->ts)
    ->where('avg_times_taken', '>=', $myId->avg_times_taken)->count();

表结构

enter image description here

比方说,我想知道我的排名。该查询需要比较我的总得分(ts)和平均花费的时间(avg_times_taken)并显示我的位置。如果两个用户获得相同的分数,则平均时间较低的用户排名会更好。

2 个答案:

答案 0 :(得分:1)

从以上评论中可以明显看出,总分与平均花费时间成反比。即total_score与average_time_taken之间的比率应为我们提供一些值,我们现在将使用该值来定位或排序记录。 因此,首先,我将在表中引入另一列并计算比率。 假设我们将列称为ratio_average

要获取我们列的值,只需输入total_score / average_time_taken

所以现在从表中获取结果时,我们只需执行以下操作:

TotalScore::orderBy('ratio_average', 'desc')->get();

现在上面将按照从第一个位置开始的正确位置顺序为您提供结果

答案 1 :(得分:1)

这是MySQL查询的样子:

SELECT 
    (
      SELECT COUNT(*)
      FROM TableScore X
      WHERE X.ts > T.ts OR (X.ts = T.ts AND X.avg_times_taken < T.avg_times_taken)
    ) + 1 AS position   
FROM TableScore T      
WHERE T.user_id = '7';

WORKING DB-FIDDLE EXAMPLE HERE