Du er nødt til at begrænse maksimum af de samlede omkostninger, ellers vil antallet af kombinationer gå til himlen, uanset hvordan du prøver at finde dem. I det følgende eksempel er det begrænset til 75, men du kan prøve andre værdier for at se det, du kan stadig finde resultater inden for rimelig tid.
Du kan også tilpasse denne løsning til at opdatere kombinationstabellen på indsatser eller opdateringer til din hovedtabel, så du kan få resultater ekstremt hurtigt for ethvert område, der ikke overskrider din indstillede grænse (men langsommere indsætninger naturligvis, da det er her alt arbejdet udføres).
Opret tabeller og udløs:
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 ;
Udfyld derefter med:
INSERT INTO newparts( name, price )
SELECT part_number, cost FROM yourtable
WHERE cost <= 75;
eller (som testdata)
INSERT INTO newparts( name, price ) VALUES
('A012', 5),('A034', 1),('A084', 10),('A094', 25),('A233', 75),
('A343', 75),('A370', 50),('B309', 13),('C124', 78);
Og få endelig dit resultat ved hjælp af:
SELECT * FROM total_max75 WHERE total BETWEEN 70 AND 75;
Du kan sætte et hvilket som helst interval her med maksimalt mindre end 75 (eller hvad du nu angiver som grænse i tabeloprettelsesdelen og triggeren).
Resultater:
A084, A370, B309 73 (you missed this one in your question)
A034, A084, A370, B309 74
A233 75
A343 75
A094, A370 75