From e3d92dfbd78b846c188e85360cf36a1bb4bbfc22 Mon Sep 17 00:00:00 2001 From: Pringgosutono Date: Thu, 8 Jan 2026 10:45:51 +0700 Subject: [PATCH] feat: Optimize query. --- app/Http/Controllers/ReportsController.php | 55 +++++++++++++++------- 1 file changed, 38 insertions(+), 17 deletions(-) diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index 04a5578..398653a 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -11,6 +11,7 @@ use Auth; use App\Responses; use App\Helper; use Carbon\Carbon; +use Carbon\CarbonPeriod; use App\Models\UserLogs; use Illuminate\Support\Facades\Crypt; use Illuminate\Contracts\Encryption\DecryptException; @@ -330,25 +331,45 @@ class ReportsController extends Controller $to_date = $req->input('to_date') - Helper::TIMEFIX; $vid = $req->input('vid'); + // Create a period between the two timestamps + $period = CarbonPeriod::create( + Carbon::createFromTimestamp($from_date)->startOfMonth(), + '1 month', + Carbon::createFromTimestamp($to_date) + ); + $subQueryParts = []; + foreach ($period as $date) { + $tableName = "tracks_" . $date->format('ym'); + + // We filter inside each table so the DB uses indexes immediately + $subQueryParts[] = "SELECT id, vhc_id, crt_d, speed + FROM $tableName + WHERE crt_d BETWEEN $from_date AND $to_date + AND action = 'location' and speed>60 + "; + } + $qString = "(" . implode(' UNION ALL ', $subQueryParts) . ")"; + // dd("qString", $qString); try { - $list = DB::select("SELECT - tv.name, tv.nopol1, - t.crt_d, t.speed, tgta.fulladdress, - tvd.speed_limit, tvd.pool_code, tvd.dc_code - from - t_gps_tracks t - left join t_vehicles tv on tv.id = t.vhc_id - left join t_vehicles_detail tvd on tvd.vid = tv.id - left join t_gps_tracks_address tgta on tgta.master_id = t.id + $list = DB::select("SELECT + tv.name, + tv.nopol1, + t.crt_d, + t.speed, + tgta.fulladdress, + tvd.speed_limit, + tvd.pool_code, + tvd.dc_code + FROM + $qString t + INNER JOIN t_vehicles tv ON tv.id = t.vhc_id + INNER JOIN t_vehicles_detail tvd ON tvd.vid = tv.id + LEFT JOIN t_gps_tracks_address tgta ON tgta.master_id = t.id WHERE - t.action = 'location' - and t.speed != 0 - AND t.crt_d BETWEEN ? AND ? - and if(? , tv.id = ? , 1=1) - -- and t.speed > tvd.speed_limit - having t.speed >= tvd.speed_limit - ORDER BY t.crt_d - ", [$from_date, $to_date, $vid, $vid]); + if(? , tv.id = ? , 1=1) + AND t.speed > tvd.speed_limit + ORDER BY t.crt_d; + ", [$vid, $vid]); // // RETURN 1 - LIST // if($req->type != 'report'){