MYSQL 查询:查找Amount列总和为指定值的对应行记录
MySQL实现子集和匹配查询
结论
可以实现,该需求属于典型的子集和匹配场景,MySQL 8.0及以上版本可通过递归公共表表达式(CTE)直接完成,低于8.0的版本需要通过存储过程实现,以下是具体实现方案。
示例表结构与测试数据
-- 示例表结构 CREATE TABLE invoices ( InvoiceNumber VARCHAR(10) NOT NULL, Amount DECIMAL(10,2) NOT NULL ); -- 插入测试数据 INSERT INTO invoices (InvoiceNumber, Amount) VALUES ('INV_1', 135.88), ('INV_2', 87.91), ('INV_3', 99.99), ('INV_4', 421.59), ('INV_5', 39.22);
核心查询语句
WITH RECURSIVE subset_sum AS ( -- 锚点成员:每一行单独作为初始子集 SELECT InvoiceNumber AS current_invoices, Amount AS total_amount, CAST(InvoiceNumber AS CHAR(255)) AS invoice_list, 1 AS level FROM invoices UNION ALL -- 递归成员:追加未包含的行扩展子集,避免重复计算 SELECT i.InvoiceNumber, ss.total_amount + i.Amount, CONCAT(ss.invoice_list, ',', i.InvoiceNumber), ss.level + 1 FROM subset_sum ss JOIN invoices i ON i.InvoiceNumber > ss.current_invoices WHERE ss.total_amount + i.Amount <= 596.69 ) -- 匹配总金额等于目标值的组合 SELECT invoice_list, total_amount FROM subset_sum WHERE total_amount = 596.69;
执行后返回结果为INV_1,INV_4,INV_5,总金额为596.69,符合需求。
注意事项
Amount字段建议使用DECIMAL类型存储,避免浮点数精度误差导致匹配失败- 子集和本身属于NP难问题,数据量大于20行时递归查询性能会急剧下降,该场景建议放到业务代码层处理
- 语句中
i.InvoiceNumber > ss.current_invoices用于去重,避免出现内容相同、顺序不同的重复组合,如需返回所有排列可删除该条件
内容的提问来源于stack exchange,提问作者Skrakle
相关产品推荐
相关产品推荐

