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
相关产品推荐
相关产品推荐

