Laravel框架SQL双字段排序实现同名分组后日期降序排列问题
问题核心原因
你的排序逻辑存在两个问题直接导致姓名混杂:
- 查询中同时选取了操作员表
operadores和客户表clientes的两个同名字段nombre,排序时字段存在歧义,无法明确命中你需要聚合的姓名字段 - 当前对姓名字段使用了
desc降序排序,如果你需要nombre1→nombre2→nombre3的正序聚合,应该改为asc升序
修改后的查询代码
先给同名字段加别名避免冲突,再调整排序规则即可:
$selectAttributes = [1,2, 3]; $data = Facturas::select( 'anio', 'mes', 'codCuenta', 'op.nombre as operador_nombre', // 给操作员姓名加别名 'fechaHora', 'cli.nombre as cliente_nombre', // 给客户姓名加别名 'cli.direccion', 'lecturaAnterior', 'lecturaTomada', ) ->leftjoin('clientes as cli', 'Facturas.codCuenta', 'cli.cod_cuenta') ->leftjoin('operadores as op', 'op.cod_operador', 'codLector') ->where('Facturas.anio', $a) ->where('Facturas.mes', $m) ->where('Facturas.ciclo', $c) ->whereIn('nombreArchivo', $selectAttributes) // 按操作员姓名聚合就用operador_nombre,按客户姓名聚合就用cliente_nombre ->orderBy('operador_nombre', 'asc') ->orderBy('fechaHora', 'desc') ->get();
特殊场景补充
如果左关联后部分operador_nombre为null导致排序混乱,可以用orderByRaw把null值统一排到末尾:
->orderByRaw('op.nombre IS NULL, op.nombre asc') ->orderBy('fechaHora', 'desc')
内容的提问来源于stack exchange,提问作者wil
相关产品推荐
相关产品推荐

