优化一个庞大但简单的mysql求和查询

优化一个庞大但简单的mysql求和查询,mysql,bigdata,query-optimization,mathematical-optimization,Mysql,Bigdata,Query Optimization,Mathematical Optimization,如何找到所有可能的a,b,c,d,e,f组合的解呢 a+b+c+d+e+f=x 给定a、b、c、d、e、f是0-999之间的整数,x是固定整数 解决方案呢 a、 b,c,d,e,f

如何找到所有可能的a,b,c,d,e,f组合的解呢

a+b+c+d+e+f=x

给定a、b、c、d、e、f是0-999之间的整数,x是固定整数

解决方案呢

a、 b,c,d,e,f (其中每个逗号都是千位分隔符)

例如,庞大的数字304153525784175764是x=2705的解决方案

自:304+153+525+784+175+764=2705

这里是我正在尝试的一个查询,x=2705,y=304153525784175764

SELECT 
    a.id,
    b.id,
    c.id,
    d.id,
    e.id,
    f.id,
    a.id+b.id+c.id+d.id+e.id+f.id AS sum
    a.id*1000*1000*1000*1000*1000+
    b.id*1000*1000*1000*1000+
    c.id*1000*1000*1000+
    d.id*1000*1000+
    e.id*1000+
    f.id AS solution
FROM a JOIN b JOIN c JOIN d JOIN e JOIN f
WHERE sum = 2705
AND solution <= 304153525784175764
ORDER BY solution DESC
选择
a、 身份证,
b、 身份证,
c、 身份证,
d、 身份证,
e、 身份证,
f、 身份证,
a、 id+b.id+c.id+d.id+e.id+f.id之和
a、 id*1000*1000*1000*1000*1000*1000+
b、 id*1000*1000*1000*1000+
c、 id*1000*1000*1000+
d、 id*1000*1000+
e、 身份证*1000+
f、 id作为解决方案
从a连接b连接c连接d连接e连接f
其中sum=2705

解如果a=000,则问题退化为找到b..f,使得b+c+d+e+f=2705。将有大量的解决方案(具有3位数的值)。我的观点是结果集太大;因此,任何查询都不能“合理调整大小”

无论如何,我会从编程语言着手,然后考虑转向SQL:

for a in (000..304)   -- this is the main use for "y"
    for b in (000..999)
        if a + b > 2705 then break
        for c in (000..999)
            if a + b + c > 2705 then break
            for d in (000..999)
                if a + b + c + d > 2705 then break
                for e in (max(000, 2705-1000-(a+b+c+d))..999)
                    if a + b + c + d + e > 2705 then break
                    f = 2705 - (a + b + c + d + e);
                    if f between 000 and 999 then
                        print a,b,c,d,e,f
(也许我会单独处理304,或者只有当a==304时,才将b停在153。)


我不敢去想在一个优化良好的编译器中运行这个程序需要多长时间。对于在SQL中执行任务所需的临时表的大小,我会更加畏缩。

为什么有六个完全相同的表?我不明白其中的逻辑remark@Strawberry为使联合会更具考虑。。你有负数吗?你得到的是每种组合的笛卡尔积。如果表是相同的结构,或者是相同的实际表,只是用不同的别名表示以支持笛卡尔组合?如果是同一个表,对于ID=1的每个表是否有效?ie:a.ID=1,b.ID=1,c.ID=1…@DRapp没有负数。如果id=1,那么这将如何得到任何解决方案?谢谢。暴力似乎很快就会爆发。如果有一种更简单的方法,那就太好了。我想,对于a..f的值,有几十亿个“答案”。所以,“蛮力”离最佳状态并不遥远。事实上,我的答案可能接近最优,尽管它有点暴力的味道。我将添加一行来帮助您。通过一个小脚本。几秒钟内就能拿到