Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Finden Sie Kombinationen, die eine Reihe von Kriterien erfüllen

Sie müssen das Maximum der Gesamtkosten begrenzen, oder die Anzahl der Kombinationen steigt in den Himmel, egal wie Sie versuchen, sie zu finden. Im folgenden Beispiel ist es auf 75 begrenzt, aber Sie können andere Werte ausprobieren, um zu sehen, ob Sie in angemessener Zeit immer noch Ergebnisse finden können.

Sie können diese Lösung auch anpassen, um die Kombinationstabelle für Einfügungen oder Aktualisierungen für Ihre Haupttabelle zu aktualisieren, sodass Sie extrem schnell Ergebnisse für jeden Bereich erhalten, der Ihr festgelegtes Limit nicht überschreitet (aber die Einfügungen werden offensichtlich verlangsamt, da hier die ganze Arbeit erledigt wird).

Tabellen erstellen und auslösen:

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 ;

Füllen Sie dann mit:

INSERT INTO newparts( name, price )
SELECT part_number, cost FROM yourtable
WHERE cost <= 75;

oder (als Testdaten)

INSERT INTO newparts( name, price ) VALUES
('A012', 5),('A034', 1),('A084', 10),('A094', 25),('A233', 75),
('A343', 75),('A370', 50),('B309', 13),('C124', 78);

Und schließlich erhalten Sie Ihr Ergebnis mit:

SELECT * FROM total_max75 WHERE total BETWEEN 70 AND 75;

Sie können hier einen beliebigen Bereich mit maximal weniger als 75 eingeben (oder was auch immer Sie als Limit im Tabellenerstellungsteil und Trigger festgelegt haben).

Ergebnisse:

A084, A370, B309        73 (you missed this one in your question)
A034, A084, A370, B309  74
A233                    75
A343                    75
A094, A370              75