gpt4 book ai didi

php - 对表进行排序并获取行位置 Laravel eloquent

转载 作者:行者123 更新时间:2023-11-29 17:35:22 26 4
gpt4 key购买 nike

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

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

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

所以,在这里我可以轻松找到排名-

foreach($results as $index => $result)
<li>{{$result->user->name}} (Rank - {{$index + 1}}) </li>

但是我如何在不获取所有记录的情况下找到排名。例如

$result = TestResult::findOrFail($id);

如何找到此结果的排名。

排名因素将与上面相同。

最佳答案

您可以在原始查询中对同一表使用 LEFT JOIN,并计算在您选择的行之前排序的所有行:

$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.markt2.accuracy = t1.accuracy 时)。因此,如果可能有联系,您应该按唯一键对它们进行排序(主键应该没问题)。那么 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();

演示:http://rextester.com/WMUJ37627

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

on (t2.mark, t2.accuracy, t2.id) > (t1.mark, t1.accuracy, t1.id)

但是 MySQL 可能无法针对索引使用对其进行优化。

更新

在版本 5.4 中,enchantedRaw() 已重命名为 fromQuery()

关于php - 对表进行排序并获取行位置 Laravel eloquent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50316435/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com