首页 > 解决方案 > 如何在 Laravel 中的联接查询中获取计数

问题描述

我想将以下 SQL 转换为 Laravel。

SELECT COUNT('uc.*') AS count_down, bs.brand_name
FROM `user_activities` AS uc
    JOIN brands AS bs ON uc.brand_id = bs.id
GROUP BY uc.brand_id
ORDER BY count_down DESC
LIMIT 5 

但是当这样做时:

$top_donwload_list = DB::table('user_activities')
    ->leftJoin('brands', 'brands.id', '=', 'user_activities.brand_id')
    ->selectRaw('brands.*, brands.brand_name, brands.id, count(user_activities.action_type) as user_activitiesCount')
    ->groupBy('user_activities.brand_id')
    ->get();

我收到此错误:

SQLSTATE [42000]:语法错误或访问冲突:1055 'colorworld.brands.id' 不在 GROUP BY 中(SQL:选择品牌。*,brands.brand_name,brands.id,count(user_activities.action_type) as user_activitiesCount from user_activitiesleft join brandson brands. id= user_activities. brand_idgroup by user_activities. brand_id)

我试图设置'strict' => truedatabase.php但我在 Laravel 5.7 中遇到了同样的错误。

更新:- 数据库表

品牌表 用户活动

标签: phpmysqllaravellaravel-5.7

解决方案


如果我正确理解了您的问题,您正在尝试查找按品牌名称分组的用户活动计数。您还希望前 5 条记录按用户活动最多的记录排序。

因此,以下应该有效:

$top_donwload_list = DB::table('user_activities')
    ->selectRaw("brands.brand_name, COUNT('user_activities.*') as user_activitiesCount")
    ->join('brands', 'brands.id', '=', 'user_activities.brand_id')
    ->groupBy('brands.brand_name')
    ->orderBy('user_activitiesCount', 'desc')
    ->take(5)
    ->get();

推荐阅读