sql >> Databáze >  >> RDS >> Mysql

Najděte kombinace, které splňují určitá kritéria

Musíte omezit maximální celkovou cenu, jinak počet kombinací vyletí do nebe, bez ohledu na to, jak se je pokusíte najít. V následujícím příkladu je to omezeno na 75, ale můžete zkusit jiné hodnoty, abyste to viděli, stále můžete najít výsledky v rozumném čase.

Toto řešení můžete také upravit pro aktualizaci tabulky kombinací na vložkách nebo aktualizace pro vaši hlavní tabulku, což vám umožní získat výsledky extrémně rychle pro jakýkoli rozsah, který nepřekračuje váš nastavený limit (ale samozřejmě zpomaluje vložky, protože tam je veškerá práce hotová).

Vytvořte tabulky a spusťte:

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 ;

Poté vyplňte pomocí:

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

nebo (jako testovací data)

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

A nakonec získejte výsledek pomocí:

SELECT * FROM total_max75 WHERE total BETWEEN 70 AND 75;

Sem můžete vložit jakýkoli rozsah s maximem menším než 75 (nebo cokoli, co nastavíte jako limit v části vytváření tabulky a spouštěče).

Výsledky:

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


  1. vložte autoinkrement do druhého sloupce

  2. Hostingový balíček na Chocolatey

  3. Je možná databáze android SQLite s databází na konkrétním místě?

  4. MySQL XDevAPI Jak vrátit úspěšný stav