如何 select Laravel 查询生成器中的每第 n 行

How to select every nth row in Laravel query builder

我有一个 API 使用 Laravel 查询生成器获取数据。我从 React 应用程序调用此 API。我的数据库中每 5 分钟就有一个新行,我需要能够检索一天或一段时间(比如一两周)的数据。 进行此调用会使我的 React 应用程序非常慢,即使我只获取一天的数据也是如此。我需要能够 select 每第 n 行,这将提高性能(以及我根据数据创建的图表的可读性......)。

我不想检索每条记录(每 5 分钟),例如我希望能够每 12 检索 1 条记录(每 60 分钟)

时间(log_time 在我的数据库中)以一种奇怪的方式存储:103500 是 10:35 上午。想在我的查询中使用模数,但我无法使其工作...

$data = DB::connection('mysql')->table('my_table')
    ->select('value','log_date','log_time')
    ->where('id_user',$userId)
    ->where('log_time', mod 500 = 0)    // This is the line I cannot get to work
    ->orderBy('log_date')
    ->orderBy('log_time')->get();

我为那条线尝试了不同的东西。有些是绝望的尝试...

->where('log_time', mod 500 = 0)   // unexpected '500', expecting ')' 
->where('log_time mod 500 = 0')    // Unknown column 'log_time mod 500 = 0'
->where('log_time mod 500', 0)     // Unknown column 'log_time mod 500'
->where('log_time', % 500 = 0)     // unexpected '%', expecting ')' 
->where('log_time % 500 = 0')      // Unknown column 'log_time % 500 = 0'
->where('log_time % 500', 0)       // Unknown column 'log_time % 500'
->where('log_time', mod 500, 0)    // unexpected '500', expecting ')' 
->where('log_time', 'mod 500', 0)  // only return result for 'log_time' = 0 (midnight)
->where('log_time', % 500, 0)      // unexpected '500', expecting ')'
->where('log_time', '% 500', 0)    // only return result for 'log_time' = 0 (midnight)
->where('log_time', MOD(500,0))    // Call to undefined function MOD()

我也试过 ->whereRaw 也没有用。

我目前无法尝试,但也许 whereRaw 可以提供帮助?

->whereRaw('log_time MOD 500 = 0')

实际上我遇到了同样的问题,接受的答案没有做它必须做的,但这是对我的问题的排序:

  • 在我的例子中,我每分钟存储一次日志,但我只想每 15 分钟(60 秒 * 15)获取一次数据:

->whereRaw('MOD(UNIX_TIMESTAMP(log_time), 60 * 15) = 0')

  • 如果你想获取数据f.e。每小时,然后 60 * 60:

->whereRaw('MOD(UNIX_TIMESTAMP(log_time), 60 * 60) = 0')

这个解决方案在许多可能的变体中都对我有效。