我在基于 Mariadb 变量的计算列上通过 HAVING 过滤 Mariadb 查询时遇到问题。
我在 Laravel Elquent 中遇到问题,我运行的查询没有产生任何结果。
我已经找到了查询中令人反感的部分,并尽可能简化了查询作为测试。
在 Laravel 中执行此代码,会产生结果“0”:
dd(\DB::table('timesheets')->select([
'timesheets.*',
DB::raw('(@test := 1) AS test1'),
DB::raw('@test AS test2'),
])->havingRaw('test2 = 1')->count());
但是如果我输出SQL:
dd(\DB::table('timesheets')->select([
'timesheets.*',
DB::raw('(@test := 1) AS test1'),
DB::raw('@test AS test2'),
])->havingRaw('test2 = 1')->toSql());
select timesheets.*, (@test := 1) AS test1, @test AS test2 from timesheets having test2 = 1
并使用 tableplus 直接针对我的 Mariadb 实例运行此查询,我得到了我期望的结果。
如果我将查询更改为:
dd(\DB::table('timesheets')->select([
'timesheets.*',
DB::raw('1 AS test1'),
DB::raw('1 AS test2'),
])->havingRaw('test2 = 1')->count());
然后我得到正确的结果“66503”。
Laravel 中似乎存在一些开销(某处!),它不喜欢 select 语句中的变量,与 MySql 的 HAVING 结合使用,但我的查询严重依赖于此。
我将不胜感激任何帮助,因为我正在用这个把我的头发撕下来!
使用这种方法:
dd( \DB::table('timesheets')
->select([
'timesheets.*',
])
->havingRaw('(SELECT @test := 1) AND (@test = 1)')
->count());