[英]How to find ids with sum of multiple rows in mysql?
這是我的mysql表。
CREATE TABLE IF NOT EXISTS tbl_money (
id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
amount int(11) NOT NULL,
used int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=latin1;
INSERT INTO tbl_money ( id , amount , used ) VALUES
(8, 2, 0),
(9, 4, 0),
(10, 4, 0),
(11, 3, 0),
(12, 8, 0),
(13, 10, 0),
(14, 13, 0);
id是主鍵字段,money可以具有從1到任意數字的任意數字。
問題:假設我必須從數量為8的表中找到ID,這很簡單,因為ID 5包含數量8。但是如果我必須找到ID與14的數量不存在。 我現在必須選擇2個或更多字段,它們的總和等於14。例如,在上表中,我可以選擇ID 6和ID 3,其總和等於14。就像我需要查找6一樣,我必須選擇id 1和2,因為它們的總和等於6。
有時,我們可能需要選擇兩行以上才能得出相等的總和。 但是,如果任何條件與表的所有行都不匹配,我們可以返回0。
條件:已被選擇的行不能再次選擇。 “使用的字段”應始終為0。如果“使用的字段”值為1,則無法選擇它。 我們只會搜索偶數,因此我們無需擔心奇數。
請建議我如何解決此算法。 提前致謝。
下面只是一個想法,請嘗試在函數或SP中實現它。
想法1:
一世。 查找您獲得的值是ODD還是EVEN 。
ii。 如果是偶數,則嘗試在表中添加兩個偶數或兩個奇數 ,並檢查其是否與您的值匹配。
iii。 如果是奇數,請嘗試從表中添加一個偶數和一個奇數,然后檢查它們是否與您的值匹配。
iv。 如果沒有得到結果,那么
想法2 :(這很簡單)
一世。 從樣本數據中得出第一個值,然后取值2
並與其他行值相加,例如2+4 == 14, 2+4 == 14, 2+3 == 14, 2+8 == 14, 2+10 == 14, 2+13 == 14
ii。 然后取第二行值,即值4
並加上其他值,例如4+4 == 14, 4+3 == 14, 4+8 == 14, 4+10== 14, 4+13 == 14
。 這里4+10
與值14
相匹配。 (如果需要所有組合,請繼續執行,否則請中斷此執行)。
iii。 直到完成10+13
組合,然后將前兩個值相加並與其他值相加,例如6+4, 6+3, 6+8, 6+10, 6+13
iv。 繼續直到組合31(2+4+4+3+8+10)+13
希望這會對您有所幫助。
純粹的SQL方法可以做到,效率可能不高:
SELECT CONCAT_WS(',', a.id, b.id, c.id, d.id)
FROM tbl_money a
INNER JOIN tbl_money b ON b.id > a.id
INNER JOIN tbl_money c ON c.id > b.id
INNER JOIN tbl_money d ON d.id > c.id
WHERE a.amount + b.amount + c.amount + d.amount = 14
UNION
SELECT CONCAT_WS(',', a.id, b.id, c.id)
FROM tbl_money a
INNER JOIN tbl_money b ON b.id > a.id
INNER JOIN tbl_money c ON c.id > b.id
WHERE a.amount + b.amount + c.amount = 14
UNION
SELECT CONCAT_WS(',', a.id, b.id)
FROM tbl_money a
INNER JOIN tbl_money b ON b.id > a.id
WHERE a.amount + b.amount = 14
UNION
SELECT a.id
FROM tbl_money a
WHERE a.amount = 14
編輯-修改以檢查使用的字段,並且金額不是奇數
SELECT CONCAT_WS(',', a.id, b.id, c.id, d.id)
FROM tbl_money a
INNER JOIN tbl_money b ON b.id > a.id AND b.used = 1 AND MOD(b.amount, 2) = 0
INNER JOIN tbl_money c ON c.id > b.id AND c.used = 1 AND MOD(c.amount, 2) = 0
INNER JOIN tbl_money d ON d.id > c.id AND d.used = 1 AND MOD(d.amount, 2) = 0
WHERE a.amount + b.amount + c.amount + d.amount = 14
AND a.used = 1
AND MOD(a.amount, 2) = 0
UNION
SELECT CONCAT_WS(',', a.id, b.id, c.id)
FROM tbl_money a
INNER JOIN tbl_money b ON b.id > a.id AND b.used = 1 AND MOD(b.amount, 2) = 0
INNER JOIN tbl_money c ON c.id > b.id AND c.used = 1 AND MOD(c.amount, 2) = 0
WHERE a.amount + b.amount + c.amount = 14
AND a.used = 1
AND MOD(a.amount, 2) = 0
UNION
SELECT CONCAT_WS(',', a.id, b.id)
FROM tbl_money a
INNER JOIN tbl_money b ON b.id > a.id AND b.used = 1 AND MOD(b.amount, 2) = 0
WHERE a.amount + b.amount = 14
AND a.used = 1
AND MOD(a.amount, 2) = 0
UNION
SELECT a.id
FROM tbl_money a
WHERE a.amount = 14
AND a.used = 1
AND MOD(a.amount, 2) = 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.