Laravel中如何同时实现distinct取值与sum()求和?
Laravel数据库查询:同时实现用户去重与订单数量求和
我正在学习Laravel的数据库操作,遇到需求:需从单表中按用户的唯一信息(name、email、phone、address)分组,获取这些去重后的用户详情,同时对ordered列进行sum()求和并展示。请问能否将sum()与去重取值同时实现?若可以,具体该如何操作?
数据库原始数据
| name | phone | address | ordered | |
|---|---|---|---|---|
| John | John@gmail.com | 55982911 | St. Louis | 2 |
| John | John@gmail.com | 55982911 | St. Louis | 1 |
| Mike | Mike@gmail.com | 55876988 | St. Thomas | 2 |
| Mike | Mike@gmail.com | 55876988 | St. Thomas | 3 |
期望展示效果
| name | phone | address | ordered | |
|---|---|---|---|---|
| John | John@gmail.com | 55982911 | St. Louis | 3 |
| Mike | Mike@gmail.com | 55876988 | St. Thomas | 5 |
现有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
相关产品推荐
相关产品推荐

