получение максимальных, минимальных, средних значений с помощью других определенных столбцов в laravel

#php #laravel

#php #laravel

Вопрос:

Моя таблица выглядит следующим образом.

 id | restaurant_id | user_id  | rating | comment 

1        1              2          3.5     comment1

2        1              2          2.1     comment2

3        1              2          4.1     comment3

4        1              2          1.6     comment4
  

Теперь у меня есть restaurant_id как 1. я хочу получить максимальный рейтинг (4.1), минимальный рейтинг (1.6) и средний рейтинг (какой бы он ни был). Я делаю это правильно, но я также хочу получить комментарий. что-то вроде этого:

 {
    "data": [
        max:{
            max_rating:4.1,
            comment:"comment 3",
            id: 3
        },

        min:{
            min_rating:1.6,
            comment: "comment 4",
            id: 4,
        }

        avg:{
            avg_rating:"whatever it is",
            //this won't have comment and id at all.
        }
    ]
}
  

Я пытался:

 $data = AppHttpModelsReview::select("id", "comment",DB::raw("MAX(rating) AS max_price, MIN(rating) AS min_price"))
        ->where("restaurant_id", 1)
        ->groupBy("id")
        ->get();
  

но не работает, как я объяснил.

Ответ №1:

Более простое решение — выполнить 3 отдельных запроса:

 $avg = Review::select(DB::raw('avg(rating) as avg_rating')
    ->where('restaurant_id', 1)
    ->groupBy('restaurant_id')
    ->get();

$max = Review::select('id','comment','rating')
    ->where('restaurant_id', 1)
    ->orderBy('rating','DESC')
    ->first();

$min = Review::select('id','comment','rating')
    ->where('restaurant_id', 1)
    ->orderBy('rating','ASC')
    ->first();

$json = json_encode(['data' => [
  'avg' => $avg,
  'max' => $max,
  'min' => $min
]]);
  

Вы могли бы извлечь значения max, min и average с помощью одного запроса, но без указания идентификатора и комментария к max / min:

 $stats = Review::select(DB::raw('avg(rating) as avg_rating, max(rating) as max_rating, min(rating) as min_rating')
        ->where('restaurant_id', 1)
        ->groupBy('restaurant_id')
        ->get();
  

Ответ №2:

Я бы попробовал эти :

 $average = AppHttpModelsReview::where("restaurant_id", 1)->avg('rating');
$max = AppHttpModelsReview::where("restaurant_id", 1)->max('rating');
$min = AppHttpModelsReview::where("restaurant_id", 1)->min('rating');
  

Если вам нужно вычислить эти значения для многих ресторанов одновременно, запрос, написанный в вашем сообщении, был бы хорошим началом. Какой результат это дает вам вместо ожидаемых значений?

Комментарии:

1. $max и $min не включал бы идентификатор и комментарий, но эти методы великолепны, и я их не знал. Спасибо!

2. Какой результат это дает вам вместо ожидаемых значений?

Ответ №3:

Простой способ получить минимальные, максимальные и средние значения в одном запросе Laravel

 $stats=stats::where('userid',Auth::User()->id)->get();
    $min=$stats->min('point');
    $max=$stats->max('point');
    $avg=$stats->avg('point');