Sql 如何在条件ie“从总和(字段)

Sql 如何在条件ie“从总和(字段),sql,mysql,Sql,Mysql,我必须只检索大小字段的和值为的特定记录,您要查找的是一个SQL语句,而不是一个SQL语句 类似于。你肯定会进入指数时间 有几种方法可以解决这个问题 以N表示的时间指数和。最大 天真的算法是循环 通过N个数和的所有子集, 对于每一个,检查 子集和到正确的数字。这个 运行时间为O2^N*N,因为 有2N个子集,要检查 每个子集,我们最多需要求和N 元素 除非您可以将问题约束到更小的子集。根据您的现有定义,您可以获得以下任何表格: userid size userid size 1

我必须只检索大小字段的和值为的特定记录,您要查找的是一个SQL语句,而不是一个SQL语句

类似于。你肯定会进入指数时间

有几种方法可以解决这个问题 以N表示的时间指数和。最大 天真的算法是循环 通过N个数和的所有子集, 对于每一个,检查 子集和到正确的数字。这个 运行时间为O2^N*N,因为 有2N个子集,要检查 每个子集,我们最多需要求和N 元素


除非您可以将问题约束到更小的子集。

根据您的现有定义,您可以获得以下任何表格:

userid size    userid size
1       70     2      100   

userid size    userid size
3       50     4       25

userid size    userid size
5      120     6       90

userid size    userid size
1       70     2      100   
3       50     3       50

userid size    userid size
1       70     2      100   
4       25     4       25

userid size    userid size
1       70     4       25
3       50     6       90
4       25

userid size    userid size
4       25     3       50
5      120     6       90

SQL不善于猜测。你的意思是说你希望大多数用户的总规模低于一定的限制?您需要创建一个包含所有用户组合的临时表,然后选择总大小小于限制的用户,然后选择用户最多的用户,可能还有最低的用户ID或其他。无论哪种方式,由于第一步的原因,它都不会很快。

这里有一个查询,它将生成上述结果:

SELECT * FROM `users` u
WHERE (select sum(size) from `users` where size <= u.size order by size) < 150
ORDER BY userid
然而,您所描述的想要选择最适合给定大小的用户的问题是一个问题。这是一个问题,用ANSI SQL很难解决。然而,上面的方法似乎返回了正确的结果,但实际上它只是从最小的项目开始,并继续添加项目,直到箱子装满为止


一个通用的、更有效的装箱算法是从最大的物品开始,然后继续添加适合的较小物品。此算法将选择用户5和用户4。

但您想最大化结果数量还是最小化结果数量,还是根本不在乎?前两种情况是约束优化,应该使用SQL进行解决,上面提到的后者需要贪婪策略。

您必须更清楚地了解大小字段的和值。这不是一个子集和问题吗?如果我没弄错的话,复杂性是指数级的。谢谢你的提问。真是太棒了。。。。。这就是我真正想要的问题。谢谢你的帮助,很高兴这对你有用。请选中此答案左侧的复选框,将其标记为正确答案。谢谢
userid size    userid size
1       70     2      100   

userid size    userid size
3       50     4       25

userid size    userid size
5      120     6       90

userid size    userid size
1       70     2      100   
3       50     3       50

userid size    userid size
1       70     2      100   
4       25     4       25

userid size    userid size
1       70     4       25
3       50     6       90
4       25

userid size    userid size
4       25     3       50
5      120     6       90
SELECT * FROM `users` u
WHERE (select sum(size) from `users` where size <= u.size order by size) < 150
ORDER BY userid