Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 排序表并获得行位置Laravel雄辩_Php_Mysql_Laravel_Eloquent - Fatal编程技术网

Php 排序表并获得行位置Laravel雄辩

Php 排序表并获得行位置Laravel雄辩,php,mysql,laravel,eloquent,Php,Mysql,Laravel,Eloquent,我有一个表名test_results,其中包含列-id、user_id、marks、accurity 现在我需要根据分数和准确度对它们进行排名,所以我喜欢这样- $results= TestResult::orderBy('mark', 'desc')->orderBy('accuracy', 'desc')->get(); 所以,在这里我可以很容易地找到排名- foreach($results as $index => $result) <li>{{$r

我有一个表名test_results,其中包含列-id、user_id、marks、accurity

现在我需要根据分数和准确度对它们进行排名,所以我喜欢这样-

$results= TestResult::orderBy('mark', 'desc')->orderBy('accuracy', 'desc')->get();
所以,在这里我可以很容易地找到排名-

foreach($results as $index => $result)
    <li>{{$result->user->name}} (Rank - {{$index + 1}}) </li>
我怎样才能找到这个结果的排名


排名因子将与上面相同。

您可以在原始查询中对同一个表使用左联接,并统计在所选行之前排序的所有行:

$result = ModelName::hydrateRaw("
    select t1.*, count(t2.id) + 1 as rank
    from table_name t1
    left join table_name t2
      on t2.mark > t1.mark
      or t2.mark = t1.mark and t2.accuracy > t1.accuracy
    where t1.id = ?
    group by t1.id
", [$id])->first();
然后,只需使用
$result->rank
即可访问排名

请注意,这不会处理领带(当
t2.mark=t1.mark
t2.accurity=t1.accurity
时)。所以,如果可能的话,你应该通过一个唯一的键对它们进行排序(主键应该可以)。那么ON条款就是

      on t2.mark > t1.mark
      or t2.mark = t1.mark and t2.accuracy > t1.accuracy
      or t2.mark = t1.mark and t2.accuracy = t1.accuracy and t2.id > t1.id
但您还应将原始查询调整为:

$results = TestResult::orderBy('mark', 'desc')
                     ->orderBy('accuracy', 'desc')
                     ->orderBy('id', 'desc')
                     ->get();
演示:

还要注意,您可以在MySQL中比较元组,并且您的ON子句也可以是

on (t2.mark, t2.accuracy, t2.id) > (t1.mark, t1.accuracy, t1.id)
但是MySQL可能无法为索引使用优化它

更新
在5.4版中,
hydraweraw()
已重命名为
fromQuery()

我收到一个错误-方法Illumb\Database\Query\Builder::hydraweraw不存在。我正在研究拉威尔5.6。尝试使用raw,但结果不符合要求。@SunnyKumar他们将其重命名为
fromQuery()
()。结果不符合预期。现在表中有三个条目。(身份证,现场测试身份证,用户身份证,标记,准确度)-(1,1,1,1100),(2,1,2,5,33),(3,1,3,12100)。我正在尝试查找id 1的等级。它应该是3,但我得到了2。@SunnyKumar抱歉-我修复了几个错误,现在添加了一个演示。
on (t2.mark, t2.accuracy, t2.id) > (t1.mark, t1.accuracy, t1.id)