You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将含ABS函数的MySQL查询转Laravel查询遇问题求助

解决Laravel查询排序与原生MySQL不一致的问题

嘿,我一眼就看出问题出在哪了——你用orderByRaw的方式错啦!

问题根源

原生MySQL语句里的order by ABS(pick_score) DESC是直接把排序方向写在排序规则后面的,但你在Laravel里写的:

$matches = $matches->orderByRaw('ABS(pick_score)', 'DESC');

这里的第二个参数'DESC'并不是用来指定排序方向的!orderByRaw的第二个参数是绑定SQL占位符的值,比如当你需要动态传入参数时才会用到,比如orderByRaw('ABS(pick_score) > ?', [500])。所以你之前的写法相当于没加DESC,排序是默认的升序,自然结果和原生MySQL不一样。

正确的写法

有两种靠谱的方式可以实现和原生MySQL一致的查询:

方式1:把排序方向直接写进orderByRaw的SQL字符串里

这是最直接的,和原生SQL写法对齐:

$matches = $matches->where('pick_score', '<>', 0)
                   ->orderByRaw('ABS(pick_score) DESC');

方式2:用orderBy结合DB::raw

如果你更习惯Laravel的链式调用风格,可以用DB::raw来包裹自定义排序规则,再指定排序方向:

use Illuminate\Support\Facades\DB;

$matches = $matches->where('pick_score', '<>', 0)
                   ->orderBy(DB::raw('ABS(pick_score)'), 'DESC');

验证效果

这两种写法最终生成的SQL都会和你最初的原生查询完全一致:

select * from matches where pick_score <> 0 order by ABS(pick_score) DESC

这样就能得到你想要的结果,那些绝对值大的数值(比如1222.9396、-914.6969)会排在前面啦!

内容的提问来源于stack exchange,提问作者Maria1995

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 10:22:43