如何 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')
这个解决方案在许多可能的变体中都对我有效。
我有一个 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')
这个解决方案在许多可能的变体中都对我有效。