优化一个庞大但简单的mysql求和查询
如何找到所有可能的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优化一个庞大但简单的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
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的值,有几十亿个“答案”。所以,“蛮力”离最佳状态并不遥远。事实上,我的答案可能接近最优,尽管它有点暴力的味道。我将添加一行来帮助您。通过一个小脚本。几秒钟内就能拿到