怎么从一个表中查询多个(包括一个)字段(数值型),字段之和约等于一个特定数,并找出其最接近的一组数。
例如表:id    num
    1      5 
        2      9
        3      2
        4      8
        5      2
        6      3假设我输入10,就能得出id    num
                      3     2
                      4     8或
                      4     8
                      5     2
注:是约等于,最接近的数。

解决方案 »

  1.   

    1:可以把功能提到程序中实现。这样一次查询性能要优
    2:使用sql表达式完成
    具体还是要找个教优算法!
      

  2.   

    只是两的和么?
    数据量不打得话 试试:
    select * from t where id  = (select a.id from t a , t b where a.num + b.num = 10 and rownum = 1 and a.id < b.id) 
    再查找另外一个?
    select * from t where num = 10 - (select num from t where id = ***)
      

  3.   

    一个笨办法(以10为例):
    (1)建立一个结构体数组,把数据库里的id和num读出来存进去
    (2)按照num的值排序
    (3)确定阀值,也就是到底十几才算“约等于”10?大于的数可以不管
    (4)得到一个数就满足条件的情况(5)10/2=5,取中间数的下标向小和大两个方向搜索数组,判断和“约等于”10,得到2个数满足条件的情况
    (6)10/3=3,。。
    (7)可以一直进行下去反正,这样做的结果就是:数据量大的情况下,你的机器保证变蜗牛!
      

  4.   

    SQL 写不出来,
    用程序或者存储过程实现。
    先选择小等于阀值的数据集合。
    再再集合中遍历查询。
      

  5.   

    select a.id id1, b.id id2, a.num*b.num num into #tmp
    from table a, table b 
    where a.id<>b.id select id1, id2, min(abs(num-10)) from #tmp
      

  6.   

    存储过程不能写,因为我现在用的Mysql较低版本,不支持。不过如果大家有存储过程的方法,可以推荐一下,方法是一样的。再就是TinyJimmy(Jimmy) 好像没明白我的意思。
      

  7.   

    如果是oracle可以这样:
    select id,num,val from (select id,num,10-(id+num) as val from test order by val) where val>=0 and rownum<2
    union
    select id,num,val from (select id,num,10-(id+num) as val from test order by val desc) where val<=0 and rownum<2
    我按你的数据取出来是如下结果:
           ID        NUM
    ---------- ----------
             2          9       /* 大于等于10的最小值 */
             6          3       /* 小于等于10的最大值 */
    不知道是不是你要的效果!
      

  8.   

    select * from t where id  = (select a.id from t a , t b where a.num + b.num = 10 and a.id < b.id limit 1 ) 
      

  9.   

    lcwlyl(网络幽灵) 
    大家不要被我举的例子迷惑,理解这个就可以了。从一组数中找出和接近于一个特定数的最佳组合。楼主的意思是,不管怎么计算只要结果最近??
    就是说两个字段不管通过像加减乘除等运算,只要结果最接近输入的数就行?
    还是只要两个字段相加的结果与输入的数据最接近?
      

  10.   

    要循环和switch..case没时间,在上班,肯定是可以写出来的。
      

  11.   

    To:qingoodrar(神吹) 
    也可以是最佳组合、次佳组合排列出来。从一组数中找出(和)接近于一个特定数的最佳组合,注意是之和,还有不是两个字段,有的话也只是一个字段。再就是最佳组合不一定是两个数,一个数,两个数,三个数或更多都有可能。
      

  12.   

    像你说得这么复杂一个SQL语句可能是搞不定的!
      

  13.   

    当然我也知道一个SQL语句很难搞定,因此让大家提供一个方法,谢谢。
      

  14.   

    一句sql很难,建议用程序吧,如果数据量较大的话,确实要用的啥路径算法,以前上数据结构的时候好像提起过
      

  15.   

    你的例子是说如果输入7
    输出的结果是
    id  num
    1   5
    3    21   5
    5   23    2
    5    2
    6    3是这个意思吗?
      

  16.   

    To: inorro() 
    差不多就这个意思。
      

  17.   

    又不能用存储过程,这个只能动态的生成sql语句了用循环。当然这个也有一个局限了。不能无限的用n个数表示它的和,总有一个限制吧?不要说限制就是整个纪录的条数哈?这样就没有折了,学习学习。