Laravel группирует и суммирует по сгруппированным строкам

#php #mysql #laravel

#php #mysql #laravel

Вопрос:

Моя цель

Я хочу группировать заказы по их «type_id» и вычислять сумму «volume_remain» для каждой группы заказов. Я ищу запрос для этого. Возможно, стоит упомянуть, что моя таблица заказов содержит около 200 000 строк.

Я работаю с фреймворком Laravel (5.8), и у меня нет опыта работы с запросами, которые не имеют очень простого характера. Из-за недостатка опыта я мало что пробовал.

Вот как создается моя таблица заказов.

 Schema::create('orders', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->integer('type_id')->index();
            $table->bigInteger('order_id')->index();
            $table->integer('duration');
            $table->string('is_buy_order');
            $table->string('issued');
            $table->integer('location_id');
            $table->integer('min_volume');
            $table->bigInteger('price');
            $table->string('range');
            $table->integer('system_id');
            $table->integer('volume_remain');
            $table->integer('volume_total');
            $table->timestamps();
        });
  

type_id: представляет элемент в игре

заказ: представляет 1 заказ на определенный товар на игровом рынке

volume_remain: объем элементов этого конкретного порядка, которые все еще находятся на рынке

Таким образом, каждый заказ принадлежит type_id, а type_id может иметь много заказов.

Желаемый результат

Моим желаемым результатом будет набор заказов, сгруппированных по их type_id, но только те заказы, которые не превышают определенную сумму их volume_remain.

Ответ №1:

Вы можете запросить что-то вроде этого

 DB::table("orders")->select("id", "type_id", "order_id", "duration",  
"is_buy_order", "issued", "location_id", "min_volume", "price", "range", 
"system_id", DB::raw("SUM(volume_remain) vr"))->groupBy("type_id")        
 ->havingRaw("vr <= ?",['specific sum']);
  

specific sum — будет той суммой, на которую она не будет превышать. Замените его соответствующей суммой.