Как считать по первым буквам в Laravel Query Builder? - PullRequest
1 голос
/ 21 января 2020

Я хочу сделать подсчет по первым буквам ... У меня есть этот столбец

enter image description here

Я хотел бы подсчитать каждую строку 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();

Ответы [ 4 ]

1 голос
/ 21 января 2020

Используйте CASE WHEN и считайте поля как OE и ASIG

$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();

1 голос
/ 21 января 2020

Вы должны попытаться использовать функцию [LIKE] [1] и добавить ее в свой запрос:

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

Редактировать:

Я много пробовал и пришел к этому решение и сделал SQL скрипка: http://sqlfiddle.com/#! 9 / 06a39b / 8

Поможет ли вам?

0 голосов
/ 21 января 2020

Я бы предложил использовать запрос для этого:

см. этот ответ


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

0 голосов
/ 21 января 2020

Вы можете использовать Коллекции. Нет необходимости сильно менять ваш запрос.

$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. Это быстрее для этого сценария.

...