Hvis jeg har læst din kode korrekt, er det du leder efter en enkelt MERGE-sætning, som du kan køre på databasen. Jeg kender ikke PHP, så jeg kan ikke give dig, hvordan det skal kaldes, men jeg kan give dig SQL-sætningen til at køre:
MERGE INTO mep_tbl_output_details tgt
USING (SELECT mtm.modelid,
mtm.model_name,
mtmc.configurationid,
mtmc.date_code,
mtmc.read_row_after,
mtmc.create_from_format,
mtmc.ip_address,
mtmc.status,
mtmc.ts_code
FROM mep_tbl_model mtm
INNER JOIN mep_tbl_model_configuration mtmc ON mtm.modelid = mtmc.modelid_fk
WHERE mtm.active = 'Y'
AND mtm.location = 'PCBA') src
ON (tgt.modelid_fk = src.modelid
AND tgt.ts_code = src.ts_code
AND tgt.configurationid_fk = src.configurationid
AND tgt.runningdate = :log_date
AND tgt.shift = 'Morning'
AND tgt.quantity_status = 'OK')
WHEN NOT MATCHED THEN
INSERT (tgt.modelid_fk, tgt.running_date, tgt.quantity_status, tgt.ts_code, tgt.shift, tgt.configuration_fk)
VALUES (src.modelid, :log_date, 'OK', src.ts_code, 'Morning', src.configurationid);
Dette udfører den join, du genopfandt med dine loops, linker den tilbage til den tabel, du forsøger at indsætte i, og indsætter kun en række, hvis den ikke allerede findes i tabellen.
Du skal skrive PHP-koden for at udføre dette, efter at have passeret log_date som en bindevariabel.
Ved at binde variablen tillader du databasen at springe den hårde analyse over (dvs. at finde ud af den bedste måde at udføre forespørgslen på), hvilket sparer tid.
Ved ikke at hente data og manuelt sløjfe rundt, før du vælger flere data og finde ud af, om du skal lave indsættelsen, springer du en hel masse kontekstskifte og trække/skubbe data over netværket. Lad databasen gøre det tunge løft; det er det, den er designet til at gøre!