【问题标题】:Laravel Eloquent skip every N th rowLaravel Eloquent 每第 N 行跳过一次
【发布时间】:2015-05-29 10:27:23
【问题描述】:

我有一个大型数据库,有 50000 多行,我试图获取所有行,但例如每 50 行跳过一次。

我从 Laravel 文档中尝试过这个:偏移和限制

$users = DB::table('users')->skip(10)->take(5)->get();

但这只会跳过前 10 行并获取接下来的 5 行。我找不到这个问题的 Eloquent 解决方案。

有人解决过这个问题吗?

【问题讨论】:

  • 所以你想跳过50,然后走一行,然后跳过50,再走另一行?您这样做是因为您担心桌子的大小吗?您是否完全关心查询运行需要多长时间?
  • @user3158900 没错! DB 太大,无法作为 JSON 发送给客户端。我不关心查询需要多长时间,因为它会被缓存。

标签: mysql laravel laravel-4 eloquent laravel-5


【解决方案1】:

使用原始查询解决:

return DB::select(DB::raw('
   SELECT dateTime, row1, row2
      FROM (
         SELECT @row := @row +1 AS rownum, dateTime, row1, row2
            FROM (
               SELECT @row :=0
            ) r, users
         ) ranked
      WHERE rownum % 50 = 0'));

这比@disf.asia 的建议要快得多。

【讨论】:

    【解决方案2】:

    你必须使用循环。

    $start = 0; 
    $skip  = 50;
    $take  = 1;
    $all = array();
    do {
       $partial = User::skip($start++ * $skip)->take($take)->get();
       $all = array_merge($all, (array) $partial);
    } while (count($partial) > 0);
    

    每跳过 50 行将占用 1 行,因此第 1、第 51、第 100 ......直到表格末尾

    【讨论】:

    • 您的方法正在运行,但查询大约需要 20 秒,这已经很多了。我找到了一个需要 400 毫秒的解决方案。
    • 嗯,你说你不关心时间!
    • 确实如此,2、3甚至5秒都可以。但是 20 秒对于 50k 行来说已经很多了。无论如何感谢您的解决方案。
    猜你喜欢
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 2021-12-26
    • 2011-11-04
    • 2020-04-19
    相关资源
    最近更新 更多