feat: Optimize query.

This commit is contained in:
Pringgosutono
2026-01-08 10:45:51 +07:00
parent 15a02914a8
commit e3d92dfbd7

View File

@ -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'){