Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Znajdź kombinacje spełniające kryteria z zakresu

Musisz ograniczyć maksymalny całkowity koszt, w przeciwnym razie liczba kombinacji poszybuje w górę bez względu na to, jak spróbujesz je znaleźć. W poniższym przykładzie jest on ograniczony do 75, ale możesz wypróbować inne wartości, aby to zobaczyć, nadal możesz znaleźć wyniki w rozsądnym czasie.

Możesz również dostosować to rozwiązanie, aby aktualizować tabelę kombinacji przy wstawianiu lub aktualizowaniu tabeli głównej, umożliwiając niezwykle szybkie uzyskanie wyników dla dowolnego zakresu, który nie przekracza ustawionego limitu (ale oczywiście spowalnia wstawianie, ponieważ to tam wykonywana jest cała praca).

Utwórz tabele i wyzwalacz:

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 ;

Następnie wypełnij za pomocą:

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

lub (jako dane testowe)

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

I na koniec uzyskaj wynik za pomocą:

SELECT * FROM total_max75 WHERE total BETWEEN 70 AND 75;

Możesz umieścić tutaj dowolny zakres z maksimum mniejszym niż 75 (lub cokolwiek, co ustawiłeś jako limit w części tworzenia tabeli i wyzwalaczu).

Wyniki:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JOIN, GROUP BY, ORDER BY

  2. Policz częstotliwość każdego słowa

  3. Wypisz za pomocą PHP wartość zmiennej lub predefiniowaną STAŁY z ciągu wynikowego MySQL

  4. MySQL Cast jako Boolean

  5. Błąd składni w pobliżu ORDER BY order DESC w MySQL