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

Laravel中如何同时实现distinct取值与sum()求和?

Laravel数据库查询:同时实现用户去重与订单数量求和

我正在学习Laravel的数据库操作,遇到需求:需从单表中按用户的唯一信息(name、email、phone、address)分组,获取这些去重后的用户详情,同时对ordered列进行sum()求和并展示。请问能否将sum()与去重取值同时实现?若可以,具体该如何操作?

数据库原始数据

nameemailphoneaddressordered
JohnJohn@gmail.com55982911St. Louis2
JohnJohn@gmail.com55982911St. Louis1
MikeMike@gmail.com55876988St. Thomas2
MikeMike@gmail.com55876988St. Thomas3

期望展示效果

nameemailphoneaddressordered
JohnJohn@gmail.com55982911St. Louis3
MikeMike@gmail.com55876988St. Thomas5

现有Blade视图代码

<table bgcolor="grey" border="2px">
    <tr>
        <th style="padding: 30px">Name</th>
        <th style="padding: 30px">Email</th>
        <th style="padding: 30px">Phone</th>
        <th style="padding: 30px">Address</th>
        <th style="padding: 30px">Ordered</th>
    </tr>

    @foreach($data as $item)

    <tr align="center">
        <td>{{$item->name}}</td>
        <td>{{$item->email}}</td>
        <td>{{$item->phone}}</td>
        <td>{{$item->address}}</td>
        <td>{{$item->ordered}}</td>
    </tr>

    @endforeach

</table>

现有后端查询代码

public function viewreservation()
{
    if(Auth::id()){

        $data=reservation::select('name', 'email', 'phone', 'address')
                           ->distinct()
                           ->get();
        return view("viewreservation",compact("data"));
    }
}

解决方案:使用分组查询替代distinct

完全可以同时实现去重和求和,不需要依赖distinct(),通过groupBy()配合聚合函数就能精准实现需求。

修改后的后端查询代码

public function viewreservation()
{
    if(Auth::id()){
        $data = reservation::select('name', 'email', 'phone', 'address')
                           ->selectRaw('SUM(ordered) as ordered')
                           ->groupBy('name', 'email', 'phone', 'address')
                           ->get();
        return view("viewreservation", compact("data"));
    }
}

关键说明

  • selectRaw('SUM(ordered) as ordered'):对每组的ordered字段求和,并重命名为ordered,确保视图能直接调用该字段名。
  • groupBy('name', 'email', 'phone', 'address'):按照用户的唯一标识组合分组,自动实现去重,每组对应一个唯一用户。
  • 注意:如果Laravel开启了严格模式(默认开启),必须保证groupBy包含所有非聚合的查询字段(即select中的name、email、phone、address),否则会触发SQL语法错误。

视图小优化

原视图中循环变量与集合变量同名(都用$data),会导致循环逻辑异常,建议改成$item,如上面的视图代码示例。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:50:36