繁体   English   中英

如何在MySQL中找到具有多行总和的ID?

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM