sql >> Database teknologi >  >> RDS >> Mysql

Find kombinationer, der opfylder en række kriterier

Du er nødt til at begrænse maksimum af de samlede omkostninger, ellers vil antallet af kombinationer gå til himlen, uanset hvordan du prøver at finde dem. I det følgende eksempel er det begrænset til 75, men du kan prøve andre værdier for at se det, du kan stadig finde resultater inden for rimelig tid.

Du kan også tilpasse denne løsning til at opdatere kombinationstabellen på indsatser eller opdateringer til din hovedtabel, så du kan få resultater ekstremt hurtigt for ethvert område, der ikke overskrider din indstillede grænse (men langsommere indsætninger naturligvis, da det er her alt arbejdet udføres).

Opret tabeller og udløs:

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 ;

Udfyld derefter med:

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

eller (som testdata)

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

Og få endelig dit resultat ved hjælp af:

SELECT * FROM total_max75 WHERE total BETWEEN 70 AND 75;

Du kan sætte et hvilket som helst interval her med maksimalt mindre end 75 (eller hvad du nu angiver som grænse i tabeloprettelsesdelen og triggeren).

Resultater:

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


  1. Konvertering af et tal til et ord i Mysql

  2. Generel fejl:1366 Forkert heltalsværdi med Doctrine 2.1 og Zend Form opdatering

  3. Download filer fra MYSQL-databasen

  4. randomisering af stort datasæt