Je moet de maximale totale kosten beperken, anders gaat het aantal combinaties de lucht in, hoe je ze ook probeert te vinden. In het volgende voorbeeld is het beperkt tot 75, maar u kunt andere waarden proberen om het te zien, u kunt nog steeds resultaten vinden binnen een redelijke tijd.
Je kunt deze oplossing ook aanpassen om combinatietabel op inserts of updates voor je hoofdtabel bij te werken, zodat je extreem snel resultaten krijgt voor elk bereik dat je ingestelde limiet niet overschrijdt (maar het vertragen van inserts natuurlijk omdat hier al het werk wordt gedaan).
Tabellen maken en activeren:
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 ;
Vul vervolgens in met:
INSERT INTO newparts( name, price )
SELECT part_number, cost FROM yourtable
WHERE cost <= 75;
of (als testgegevens)
INSERT INTO newparts( name, price ) VALUES
('A012', 5),('A034', 1),('A084', 10),('A094', 25),('A233', 75),
('A343', 75),('A370', 50),('B309', 13),('C124', 78);
En tot slot krijg je je resultaat met:
SELECT * FROM total_max75 WHERE total BETWEEN 70 AND 75;
U kunt hier elk bereik plaatsen met een maximum van minder dan 75 (of wat u ook instelt als limiet in het gedeelte voor het maken van tabellen en trigger).
Resultaten:
A084, A370, B309 73 (you missed this one in your question)
A034, A084, A370, B309 74
A233 75
A343 75
A094, A370 75