Anda harus membatasi biaya total maksimum, atau jumlah kombinasi akan naik ke langit tidak peduli bagaimana Anda mencoba menemukannya. Dalam contoh berikut ini dibatasi hingga 75, tetapi Anda dapat mencoba nilai lain untuk melihatnya, Anda masih dapat menemukan hasil dalam waktu yang wajar.
Anda juga dapat mengadaptasi solusi ini untuk memperbarui tabel kombinasi pada sisipan atau pembaruan untuk tabel utama Anda, memungkinkan Anda mendapatkan hasil yang sangat cepat untuk rentang apa pun yang tidak melebihi batas yang Anda tetapkan (tetapi memperlambat sisipan jelas karena di situlah semua pekerjaan selesai).
Buat tabel dan pemicu:
CREATE TABLE `total_max75` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parts` varchar(255) NOT NULL,
`num` int(11) NOT NULL,
`total` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `total` (`total`,`num`)
);
CREATE TABLE `newparts` (
`name` char(4) NOT NULL,
`price` int(11) NOT NULL,
PRIMARY KEY (`name`)
);
DELIMITER //
CREATE TRIGGER addtotal AFTER INSERT ON newparts
FOR EACH ROW
BEGIN
IF NEW.price <= 75 THEN
INSERT INTO total_max75 ( parts, num, total )
SELECT CONCAT( t.parts, ', ', NEW.name),
t.num+1, t.total+NEW.price
FROM total_max75 t
WHERE t.total <= 75 - NEW.price AND num < 40;
INSERT INTO total_max75( parts, num, total )
VALUES( NEW.name, 1, NEW.price );
END IF;
END//
DELIMITER ;
Kemudian isi menggunakan:
INSERT INTO newparts( name, price )
SELECT part_number, cost FROM yourtable
WHERE cost <= 75;
atau (sebagai data uji)
INSERT INTO newparts( name, price ) VALUES
('A012', 5),('A034', 1),('A084', 10),('A094', 25),('A233', 75),
('A343', 75),('A370', 50),('B309', 13),('C124', 78);
Dan akhirnya dapatkan hasil Anda menggunakan:
SELECT * FROM total_max75 WHERE total BETWEEN 70 AND 75;
Anda dapat menempatkan rentang apa pun di sini dengan maksimum kurang dari 75 (atau apa pun yang Anda tetapkan sebagai batas di bagian dan pemicu pembuatan tabel).
Hasil:
A084, A370, B309 73 (you missed this one in your question)
A034, A084, A370, B309 74
A233 75
A343 75
A094, A370 75