Mysql
 sql >> база данни >  >> RDS >> Mysql

Намерете комбинации, които отговарят на различни критерии

Трябва да ограничите максималната обща цена, или броят на комбинациите ще се издигне до небето, независимо как се опитвате да ги намерите. В следващия пример е ограничен до 75, но можете да опитате други стойности, за да го видите, все пак можете да намерите резултати в разумен срок.

Можете също така да адаптирате това решение за актуализиране на таблицата с комбинации на вмъквания или актуализации за вашата основна таблица, което ви позволява да получавате резултати изключително бързо за всеки диапазон, който не надвишава зададения лимит (но забавя вмъкването очевидно, тъй като там се извършва цялата работа).

Създайте таблици и задействайте:

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 ;

След това попълнете с помощта на:

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

или (като тестови данни)

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

И накрая получете резултата си, като използвате:

SELECT * FROM total_max75 WHERE total BETWEEN 70 AND 75;

Можете да поставите всеки диапазон тук с максимум по-малко от 75 (или каквото сте задали като ограничение в частта за създаване на таблица и задействане).

Резултати:

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. фатална грешка, възникнала по време на изпълнение на командата по време на актуализиране

  2. Бройте медианата, групирана по ден

  3. MySQL - Как да получите резултати от търсенето с точна релевантност

  4. PHP - Грешка с отказан достъп до MySQL - Работи в други програми

  5. Хибернация - Има ли начин да се обединят 2 колони срещу 1?