Php 排序表并获得行位置Laravel雄辩
我有一个表名test_results,其中包含列-id、user_id、marks、accurity 现在我需要根据分数和准确度对它们进行排名,所以我喜欢这样-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
$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)