【问题标题】:Calculate user ranking in search results [Laravel]计算用户在搜索结果中的排名 [Laravel]
【发布时间】:2016-12-17 13:55:31
【问题描述】:

我有一个ranking 模块,用户可以在其中搜索其他用户。结果显示在表格中,对于每个结果,我还想显示用户当前的排名位置。所以比如搜索dav,结果可能是:

--  Position   --   Points   --  Name  --
     30              2345         Dave
     105             1650         Davy
     965             895          Superdavy
     1949            35           Dave123

我的问题是:计算职位的最佳方法是什么?排名是通过points 订购用户来计算的。我可以让所有用户使用

$results = User::where('name', 'LIKE', "%$query%")->orderBy('points')->paginate(25);

但是我应该遍历结果并为每个用户查询数据库以计算排名位置吗?或者有没有更简单的方法?因为,如果搜索包含 50 个结果并且有人在几秒钟内搜索了多次,则会触发大量数据库查询...

【问题讨论】:

  • 请显示排名数字存储在哪里或如何计算。
  • 糟糕,抱歉,我更新了答案
  • 位置栏不是多余的吗?
  • @BaikHo,是的,该列不是数据库的一部分,但它是在前端显示时计算的。
  • 当您有很多要排名的项目时,重新计算排名是一项代价高昂的任务。重新考虑实时进行的必要性。

标签: php mysql performance laravel laravel-5


【解决方案1】:

如果您有数以万计的用户,我想最好使用调度程序任务,它会每小时重新计算每个用户的当前位置。

如果没有,请尝试在运行时计算位置:

$positions = User::orderBy('points', 'desc')->pluck('id')->toArray();

将此变量传递给视图并显示位置:

{{ array_search($user->id, $positions) + 1 }}

【讨论】:

    【解决方案2】:

    您可以通过按降序排列点来获得如上所示的表格输出,这样您就可以很好地获得排名。 $results = User::where('name', 'LIKE',"%$query%")->orderBy('points', 'desc')->paginate(25);

    是的,分页的概念很好,因为结果可以是任意数字,因此您可以同时控制大量查询执行。 但是您不再关心他们执行查询的次数,您无法控制它并且您无法控制它。 你所能做的就是一些兑现机制:

    $results = User::where('name', 'LIKE',"%$query%")->orderBy('points', 'desc')->remember(50)->paginate(25);

    这会将以上记录存储在缓存中,因此如果您尝试执行下一个查询,它会检索缓存的结果,而不是向数据库触发 sql 查询。或者你可以在 laravel 中使用块。 DB::table('users')->where('name', 'LIKE', "%$query%")->orderBy('points', 'desc')->chunk(100, function ($users) { foreach ($users as $user) { // here you can use filters } });

    所有这些都可以在 laravel 的这个页面中找到,希望这对你有帮助。 https://laravel.com/docs/5.3/queries

    【讨论】:

    • 但是如何计算每个用户在搜索结果中的排名?
    • 好的,问题是要获得看起来你可以做的位置是:$results = User::where('name', 'LIKE', "%$query%")->orderBy('points', 'desc')->pluck('name')->toArray(); $position = array_search('name', $results) + 1;`
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多