Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Temukan kombinasi yang memenuhi kriteria rentang

Anda harus membatasi biaya total maksimum, atau jumlah kombinasi akan naik ke langit tidak peduli bagaimana Anda mencoba menemukannya. Dalam contoh berikut ini dibatasi hingga 75, tetapi Anda dapat mencoba nilai lain untuk melihatnya, Anda masih dapat menemukan hasil dalam waktu yang wajar.

Anda juga dapat mengadaptasi solusi ini untuk memperbarui tabel kombinasi pada sisipan atau pembaruan untuk tabel utama Anda, memungkinkan Anda mendapatkan hasil yang sangat cepat untuk rentang apa pun yang tidak melebihi batas yang Anda tetapkan (tetapi memperlambat sisipan jelas karena di situlah semua pekerjaan selesai).

Buat tabel dan pemicu:

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 ;

Kemudian isi menggunakan:

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

atau (sebagai data uji)

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

Dan akhirnya dapatkan hasil Anda menggunakan:

SELECT * FROM total_max75 WHERE total BETWEEN 70 AND 75;

Anda dapat menempatkan rentang apa pun di sini dengan maksimum kurang dari 75 (atau apa pun yang Anda tetapkan sebagai batas di bagian dan pemicu pembuatan tabel).

Hasil:

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. Bagaimana cara mengambil catatan pertama dan terakhir dari catatan yang dikelompokkan dalam kueri MySQL dengan fungsi agregat?

  2. Laravel PDOException SQLSTATE[HY000] [1049] Basis data tidak dikenal 'menempa'

  3. Bagaimana menganggap NULL sebagai tanggal MAX alih-alih mengabaikannya di MySQL?

  4. Menyimpan Sesi di Tabel DB Tidak Berfungsi (menggunakan Zend_Session_SaveHandler_DbTable)

  5. kesalahan migrasi artisan php:nodename atau servname disediakan atau tidak tahu