【问题标题】:Is it possible to count the groups after groupby statement in laravel?是否可以在 laravel 中的 groupby 语句之后计算组?
【发布时间】:2021-01-22 09:53:56
【问题描述】:

我有以下表结构。

学生

  • 身份证

  • 名字

  • 姓氏

  • roll_number

我有以下查询:

$query = Student::select(
'first_name',
'last_name', 
'roll_number', 
 DB::raw('CONCAT(first_name,last_name) as full_name')
)->groupBy('full_name');

我想要得到的是计算具有唯一全名的行。

当我在上面的查询中附加 ->count() 时,它会给出 full_name 的 Column not found 异常

我的方法:

$query = Student::select(
'first_name',
'last_name', 
'roll_number', 
 DB::raw('CONCAT(first_name,last_name) as full_name')
)->groupBy('full_name');

$count =  $query->get()->count();

它给了我正确的计数,但是当我在数据库中有大量学生时,可能会出现一些性能问题,因为在计数集合$query->get() 时将处理所有学生。

有什么方法可以实现我想要实现的目标吗?

非常感谢您的建议,如果我们在 laravel 中无法实现,请提供详细信息。

【问题讨论】:

    标签: php mysql laravel eloquent


    【解决方案1】:

    您应该只按名字和姓氏列进行聚合:

    $query = Student::select(DB::raw('CONCAT(first_name, last_name) AS full_name'))
        ->groupBy('first_name', 'last_name');
    $count = $query->get()->count();
    

    请注意,您当前的查询无效,因为您按全名分组,但正在选择其他非聚合列。此外,假设名字和姓氏的连接意味着您认为它的作用是危险的。考虑:

    bo derick
    bode rick
    

    这两个人(不同的)将具有相同的串联全名。相反,分别按名字和姓氏列聚合。

    编辑:

    我不知道 Laravel 的 count() 函数是如何在底层实现的,特别是它是否足够聪明知道在 MySQL 服务器上进行计数,而不是将整个结果集交给 PHP 和数着它。直接在 MySQL 上进行计数查询可能会有所帮助:

    $sql = "SELECT COUNT(*) FROM (SELECT 1 FROM student GROUP BY first_name, last_name) t";
    $count = Student::select(DB::raw($sql))->get();
    

    【讨论】:

    • 您好先生,感谢您的热心回复,我们可以不使用->get()声明吗?
    • @SagarGautam 我给了你一个原始的 MySQL 查询,可用于查找不同名字/姓氏的计数。这可能比您当前的方法更有效。
    猜你喜欢
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 2021-11-11
    • 2023-02-10
    • 2017-01-16
    • 2016-03-16
    • 2011-07-31
    相关资源
    最近更新 更多