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

Laravel中groupBy结合orderBy DESC失效,CAST转换无作用

Laravel groupBy + orderBy 排序失效问题解决

问题根源

你的查询存在两个关键问题:

  • select语句中包含了未聚合的amount字段,在groupBy('listing_id')的场景下,这个字段会返回分组内随机一行的amount值,不仅逻辑无意义,还可能干扰数据库对total字段的类型判断。
  • 如果amount字段本身是字符串类型,你先求和再转类型的操作无效——因为字符串求和会按字符串拼接处理,转换后依然不是正确的数值总和。

修正方案

方案1:修正字段聚合与类型转换顺序

先将每行的amount转成无符号整数再求和,同时移除无意义的amount字段:

$this->adLists = ListingVisitor::with('listing')
    ->selectRaw('SUM(CAST(amount AS UNSIGNED)) AS total, listing_id')
    ->whereHas('listing.user', function($q) {
        $q->where('id', Auth::user()->id);
    })
    ->groupBy('listing_id')
    ->orderBy('total', 'DESC')
    ->paginate(10);

方案2:直接使用聚合表达式排序(避免别名歧义)

如果方案1仍不生效,可跳过别名直接在orderBy中使用聚合逻辑:

$this->adLists = ListingVisitor::with('listing')
    ->selectRaw('SUM(CAST(amount AS UNSIGNED)) AS total, listing_id')
    ->whereHas('listing.user', function($q) {
        $q->where('id', Auth::user()->id);
    })
    ->groupBy('listing_id')
    ->orderByRaw('SUM(CAST(amount AS UNSIGNED)) DESC')
    ->paginate(10);

补充说明

如果你的MySQL开启了严格模式,原查询中的select包含未聚合的amount字段会直接报错,移除该字段也能避免这类潜在问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 10:43:18