sql >> Databasteknik >  >> RDS >> Mysql

Hitta kombinationer som uppfyller olika kriterier

Du måste begränsa den totala kostnaden maximalt, annars kommer antalet kombinationer att gå upp till himlen oavsett hur du försöker hitta dem. I följande exempel är den begränsad till 75, men du kan prova andra värden för att se den. Du kan fortfarande hitta resultat inom rimlig tid.

Du kan också anpassa den här lösningen för att uppdatera kombinationstabellen på inlägg eller uppdateringar för din huvudtabell, så att du kan få resultat extremt snabbt för alla intervall som inte överskrider din inställda gräns (men saktar uppenbarligen insatserna eftersom det är där allt arbete görs).

Skapa tabeller och utlösa:

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 ;

Fyll sedan i 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);

Och slutligen få ditt resultat med:

SELECT * FROM total_max75 WHERE total BETWEEN 70 AND 75;

Du kan sätta vilket intervall som helst här med maximalt mindre än 75 (eller vad du nu ställer in som gräns i tabellskapandedelen och triggern).

Resultat:

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


  1. När prestandan för Distinct och Group By är olika?

  2. C# - MySQL vs Microsoft SQL Server

  3. Buffertcache:Vad är det och hur påverkar det databasens prestanda?

  4. Hur man förhindrar rastillstånd i online hotellbokning