你必须限制最大总成本的,或组合的数量将无论你如何找到它们,都要上天。在下面的例子中它被限制为75,但你可以尝试其他值来看它,你仍然可以在合理的时间内找到结果。
您也可以使用此解决方案来更新主表的插入或更新组合表,让您在任何范围内都可以非常快地得到结果,而且不会超出您的设定限制(但是显然减慢了插入,因为它是所有工作的地方完成)。
创建表和触发器:
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 ;
然后填充使用:
INSERT INTO newparts(name, price)
SELECT part_number, cost FROM yourtable
WHERE cost <= 75;
或(如测试数据)
INSERT INTO newparts(name, price) VALUES
('A012', 5),('A034', 1),('A084', 10),('A094', 25),('A233', 75),
('A343', 75),('A370', 50),('B309', 13),('C124', 78);
终于得到你的结果使用:
SELECT * FROM total_max75 WHERE total BETWEEN 70 AND 75;
您可以将最大值小于75的任何范围(或者您在表格创建部分和触发器中设置的任何限制)放在这里。
结果:
A084, A370, B309 73 (you missed this one in your question)
A034, A084, A370, B309 74
A233 75
A343 75
A094, A370 75
我接受了这个答案,因为它与问题中的测试数据一起工作。但是,除非证明它可能无法解决,否则它不能解决我的问题。这基本上是我考虑的第一种方法(遍历所有组合)添加首先将所有组合存储在表中的想法。就像你说的那样,小组的作品会随着名单的增长而变得疯狂。感谢您确认在阶乘墙上没有办法。 – biscuit314 2012-02-18 16:46:38