我想通过将时区偏移+05:54从位置表中获取当前日期的所有max_idmin_id。我试过了

$maxminpositionids = DB::table('tc_positions')
        ->select(DB::raw('max(id) maxid, min(id) minid, deviceid, date(CONVERT_TZ(servertime,\'+00:00\',\'+05:45\' )) as serv'))
        ->where('serv', '=', Carbon::now()->toDateString())
        ->get();


我有这个错误
mysql - 如何在Laravel的where子句中使用alised列-LMLPHP

有什么方法可以解决和优化此查询?

最佳答案

在MySQL中,可以在select子句中创建列别名,但是,由于语法无效,因此不能在同一查询的where子句中使用它们。我只能猜测原因,这可能是一个依赖性问题,因为当搜索记录时,引擎将检查它们是否在结果集中,然后才在select子句中运行逻辑。这只是一个猜测,但这很合理,因为如果选择部分首先运行,查询会慢很多,而且,我们会遇到诸如需要原始字段以及可能创建与现有列相同的别名之类的问题名称。无论我对问题的原因是否正确,都不能在where子句中使用列别名。相反,只需调用whereRaw并将相同的值传递给它:

$serv = 'date(CONVERT_TZ(servertime,\'+00:00\',\'+05:45\' ))';
$maxminpositionids = DB::table('tc_positions')
        ->select(DB::raw('max(id) maxid, min(id) minid, deviceid, '.$serv.' as serv'))
        ->whereRaw($serv.'= ?', Carbon::now()->toDateString())
        ->get();

08-06 23:56