[英]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.