Запрос, который приносит большинство вхождений определенного поля в Laravel - PullRequest
1 голос
/ 26 октября 2019

У меня следующий запрос:

$top_cont = DB::table('quests') 
       ->whereBetween('created_at', [Carbon::now()->startOfDay(), Carbon::now()->endOfDay()])  
       ->take(5)
       ->get(); 

В таблице quests есть столбец user_id. Я пытаюсь получить топ-5 user_id с наибольшим количеством вкладов (т. Е. Имеет наибольшее количество строк в таблице квестов за этот день).

Как мне настроить запрос, чтобы получитьuser_id с наибольшим количеством случаев?

Если кто-то может сделать это в raw sql, это тоже будет полезно.

Ответы [ 2 ]

2 голосов
/ 26 октября 2019

Вы можете сделать что-то вроде этого:

$top_cont = DB::table('quests') 
    ->select('user_id', DB::raw('count(*) as contributions'))
    ->whereDate('created_at', '>=', now()->startOfDay()) 
    ->take(5)
    ->groupBy('user_id')
    ->orderBy('contributions', 'desc')
    ->get(); 

Это должно дать вам 5 записей с этой формой:

dd($top_cont);
=> Illuminate\Support\Collection {#3403
     all: [
       {#256
         user_id: 2,
         contributions: 51,
       },
       {#3417
         user_id: 975,
         contributions: 50,
       },
       {#3418
         user_id: 743,
         contributions: 46,
       },
       {#3419
         user_id: 538,
         contributions: 45,
       },
       {#3420
         user_id: 435,
         contributions: 18,
       },
     ],
   }
1 голос
/ 26 октября 2019

Вы можете использовать следующий запрос:

    DB::table('quests') 
       ->whereBetween('created_at', [ Carbon::now()->startOfDay(),Carbon::now()->endOfDay()])
        ->select('user_id', DB::raw('count(*) as count') )
        ->groupBy('user_id')
        ->limit(5)
        ->orderBy ( 'count  DESC')
        ->get();
...