sql >> Database >  >> RDS >> Mysql

Vind combinaties die voldoen aan een reeks criteria

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


  1. Java-kruistabel - query voor opgestelde instructie

  2. Bereken het verschil tussen twee datetimes in MySQL

  3. 60 miljoen inzendingen, selecteer inzendingen uit een bepaalde maand. Hoe database optimaliseren?

  4. MySQL SELECTEER IN OUTFILE Exportopties