Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Tìm các kết hợp đáp ứng một tiêu chí khác nhau

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tại sao lỗi di chuyển cơ sở dữ liệu này sau khi tôi nâng cấp phiên bản django-mptt của mình?

  2. Tại sao các chữ cái tiếng Ả Rập không được chèn vào cơ sở dữ liệu?

  3. Haversine và Laravel

  4. Câu hỏi dễ dàng về mysql liên quan đến khóa chính và một bộ chèn

  5. Cài đặt MYSQL với ứng dụng .NET winforms