Bạn phải giới hạn tối đa tổng chi phí, nếu không số lượng kết hợp sẽ tăng cao bất kể bạn cố gắng tìm chúng bằng cách nào. Trong ví dụ sau, nó được giới hạn ở 75, nhưng bạn có thể thử các giá trị khác để xem, bạn vẫn có thể tìm thấy kết quả trong một thời gian hợp lý.
Bạn cũng có thể điều chỉnh giải pháp này để cập nhật bảng kết hợp trên các mục chèn hoặc cập nhật cho bảng chính của mình, cho phép bạn nhận được kết quả cực kỳ nhanh chóng cho bất kỳ phạm vi nào không vượt quá giới hạn đã đặt của bạn (nhưng việc chèn chậm rõ ràng vì đó là nơi tất cả công việc được thực hiện).
Tạo bảng và kích hoạt:
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 ;
Sau đó điền bằng:
INSERT INTO newparts( name, price )
SELECT part_number, cost FROM yourtable
WHERE cost <= 75;
hoặc (dưới dạng dữ liệu thử nghiệm)
INSERT INTO newparts( name, price ) VALUES
('A012', 5),('A034', 1),('A084', 10),('A094', 25),('A233', 75),
('A343', 75),('A370', 50),('B309', 13),('C124', 78);
Và cuối cùng nhận được kết quả của bạn bằng cách sử dụng:
SELECT * FROM total_max75 WHERE total BETWEEN 70 AND 75;
Bạn có thể đặt bất kỳ phạm vi nào ở đây với tối đa nhỏ hơn 75 (hoặc bất kỳ phạm vi nào bạn đặt làm giới hạn trong phần tạo bảng và trình kích hoạt).
Kết quả:
A084, A370, B309 73 (you missed this one in your question)
A034, A084, A370, B309 74
A233 75
A343 75
A094, A370 75