【问题标题】:How count by the first letters in Laravel Query Builder?Laravel Query Builder 中的第一个字母如何计算?
【发布时间】:2020-05-07 15:08:56
【问题描述】:

我想按第一个字母数数...我有这个专栏

我想计算每个 OE 行和每个 GICS 行

我正在处理这个查询

$data4 = DB::table('incidencias')
   ->select(DB::raw('grupo_asig as grupo_asig'), DB::raw('count(*) as number'))
   ->whereNotIn('grupo_asig', [''])
   ->groupBy('grupo_asig')
   ->orderBy('number', 'desc')
   ->get();

【问题讨论】:

    标签: sql laravel eloquent laravel-query-builder


    【解决方案1】:

    使用CASE WHEN 并计算OEASIG 等字段

    $data4 = DB::table('incidencias')
               ->select(DB::raw("(CASE WHEN grupo_asig LIKE 'OE%' THEN 'OE'
                                       WHEN grupo_asig LIKE 'GICS%' THEN 'GICS'
                                  END) AS grupo_asig_type"), 
                        DB::raw('COUNT(*) as number'))
               ->whereNotIn('grupo_asig', [''])
               ->groupBy('grupo_asig_type')
               ->orderBy('number', 'desc')
               ->get();
    
    

    【讨论】:

    • 我得到一个错误,因为我正在使用一个数组来制作图形
    • 我用了这个 $array4[] = ['Grupo Asignado', 'Number']; foreach($data4 as $key4 => $value4) { $array4[++$key4] = [$value4->grupo_asig, $value4->number]; }
    • @Oscar 好的,我正在选择一条记录中的两个值,看来您要获取两条记录和两个字段(grupo_asig, number),grupo_asig 的值是多少,如果它以oegics 开头
    • @Oscar 我已经更新了,这个会根据grupo_asig产生很少的记录
    • @Oscar 因为我把它改成了grupo_asig_type
    【解决方案2】:

    您应该尝试使用 [LIKE][1] 函数并将其添加到您的查询中:

    ->where('grupo_asig', 'like', 'OE%')
    ->where('grupo_asig', 'like', 'GICS%')
    

    编辑:

    我尝试了很多,最终找到了这个解决方案并制作了一个 SQL fiddle:http://sqlfiddle.com/#!9/06a39b/8

    对你有帮助吗?

    【讨论】:

    • 仅适用于计数 OE 和 GICS,但我想在一个计数中加入所有 OE,在另一个计数中加入所有 GICS
    • 你想用一个查询还是一个查询来解决这个问题?
    • 一个查询,因为我将它用于图形
    • 抱歉,忘记",再试一次?
    • 我试图在一个数组中传递这个图形......所以我使用了这个代码 $array4[] = ['Grupo Asignado', 'Number']; foreach($data4 as $key4 => $value4) { $array4[++$key4] = [$value4->grupo_asig, $value4->number]; ... 并使用你的方法我得到了这个错误 Undefined property: Illuminate\Database\MySqlConnection::$grupo_asig.. 你知道为什么吗?非常感谢您的帮助
    【解决方案3】:

    您可以使用集合。无需对查询进行太多更改。

    $data4 = DB::table('incidencias')
       ->select('grupo_asig')
       ->selectRaw('count(*) as number'))
       ->whereNotIn('grupo_asig', [''])
       ->groupBy('grupo_asig')
    //   ->orderBy('number', 'desc') Unless you use this array somewhere, it's not needed.
       ->get(); 
    
    use Illuminate\Support\Str;
    ...
    
    // php >= 7.4.0
    $oe_count = $data4->filter(fn($data) => Str::startsWith($data->grupo, 'OE '))->count();
    $gigs_count = $data4->filter(fn($data) => Str::startsWith($data->grupo, 'GIGS '))->count();
    // php < 7.4.0
    $oe_count = $data4->filter(function ($data) {
        return Str::startsWith($data->grupo, 'OE ');
    })->count();
    $gigs_count = $data4->filter(function ($data) {
        return Str::startsWith($data->grupo, 'GIGS ');
    })->count();
    

    从 Laravel 6 开始,您还可以在查询中使用 cursor() 而不是 get() 来返回 LazyCollection。这种情况下速度更快。

    【讨论】:

      【解决方案4】:

      我建议为此使用查询:

      参考this answer

      
      SELECT
          LEFT(grupo_asig, 1) AS first_letter,
          COUNT(*) AS total
      FROM incidencias
      GROUP BY first_letter
      
      

      【讨论】:

        猜你喜欢
        • 2020-05-02
        • 1970-01-01
        • 1970-01-01
        • 2020-05-06
        • 1970-01-01
        • 1970-01-01
        • 2015-12-05
        • 2015-04-09
        • 2016-07-22
        相关资源
        最近更新 更多