看一下这个(数据库查询)

时间:2022-12-11 15:24:17
怎么从一个表中查询多个(包括一个)字段(数值型),字段之和约等于一个特定数,并找出其最接近的一组数。
例如表: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
注:是约等于,最接近的数。

43 个解决方案

#1


up

#2


不懂,帮顶一下

#3


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

#4


只是两的和么?
数据量不打得话 试试:
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 = ***)

#5


一个笨办法(以10为例):
(1)建立一个结构体数组,把数据库里的id和num读出来存进去
(2)按照num的值排序
(3)确定阀值,也就是到底十几才算“约等于”10?大于的数可以不管
(4)得到一个数就满足条件的情况

(5)10/2=5,取中间数的下标向小和大两个方向搜索数组,判断和“约等于”10,得到2个数满足条件的情况
(6)10/3=3,。。。。。
(7)可以一直进行下去

反正,这样做的结果就是:数据量大的情况下,你的机器保证变蜗牛!

#6


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

#7


写个存储过程

#8


up

#9


一组数并不只是两个,是不固定的,可能是一个,两个,三个,四个或更多。表只是一个,而且是一个字段的值。

#10


大家提供一个方法吧,应该有的,小弟谢谢先。(不知道有这个算法吗)

#11


up  看来只能存储过程了

#12


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

#13


存储过程不能写,因为我现在用的Mysql较低版本,不支持。不过如果大家有存储过程的方法,可以推荐一下,方法是一样的。

再就是TinyJimmy(Jimmy) 好像没明白我的意思。

#14


有人推荐用关键路径的方法,合适吗?如何来做。

#15


数据量很大的话,可能会很慢。
因为肯定是要遍历所有数据才知道哪个最接近的。

#16


学习

#17


星期一早上继续UP.....

#18


帮UP

#19


可能这样说有的朋友可能不明白,换种方法说就是从一组数中找出接近于一个特定数的最佳组合。如:
一组数:     5 9 2 8 2 3
输入特定数: 10
结果:2  8 


注:是最接近的,(当然,等于是最接近的)。没有等于的时候找最接近的

#20


如果是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的最大值 */
不知道是不是你要的效果!

#21


完全没看明白楼主说的是什么..........

#22


UP

#23


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 ) 

#24


可能我表达能力太差,不好意思。这结果并不只是我列出的两项,而且我说过不只是两项之和,还有可能是2、3、5等等。

#25


越来越糊涂了,劳驾楼主把想解决的问题重新给梳理一下!

#26


通过存储过程来写应该可以

#27


大家不要被我举的例子迷惑,理解这个就可以了。

从一组数中找出和接近于一个特定数的最佳组合。

#28


今天继续顶。。

#29


lcwlyl(网络幽灵) 
大家不要被我举的例子迷惑,理解这个就可以了。

从一组数中找出和接近于一个特定数的最佳组合。

楼主的意思是,不管怎么计算只要结果最近??
就是说两个字段不管通过像加减乘除等运算,只要结果最接近输入的数就行?
还是只要两个字段相加的结果与输入的数据最接近?


#30


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

#31


To:qingoodrar(神吹) 
也可以是最佳组合、次佳组合排列出来。

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

#32


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

#33


路过,忙碌中……  同是五角,友情UP一下,回头再细看

#34


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

#35


学习

#36


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

#37


你的例子是说如果输入7
输出的结果是
id  num
1   5
3    2

1   5
5   2

3    2
5    2
6    3

是这个意思吗?

#38


关注!学习!

#39


学习中,谢谢各位。

#40


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

#41


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

#42


现在有人说这个问题有点类似于背包问题,正在参考。。。。

#43


背包问题可以暂时满足我的需要,但找出最优解还是比较麻烦。大家可以继续讨论。

#1


up

#2


不懂,帮顶一下

#3


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

#4


只是两的和么?
数据量不打得话 试试:
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 = ***)

#5


一个笨办法(以10为例):
(1)建立一个结构体数组,把数据库里的id和num读出来存进去
(2)按照num的值排序
(3)确定阀值,也就是到底十几才算“约等于”10?大于的数可以不管
(4)得到一个数就满足条件的情况

(5)10/2=5,取中间数的下标向小和大两个方向搜索数组,判断和“约等于”10,得到2个数满足条件的情况
(6)10/3=3,。。。。。
(7)可以一直进行下去

反正,这样做的结果就是:数据量大的情况下,你的机器保证变蜗牛!

#6


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

#7


写个存储过程

#8


up

#9


一组数并不只是两个,是不固定的,可能是一个,两个,三个,四个或更多。表只是一个,而且是一个字段的值。

#10


大家提供一个方法吧,应该有的,小弟谢谢先。(不知道有这个算法吗)

#11


up  看来只能存储过程了

#12


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

#13


存储过程不能写,因为我现在用的Mysql较低版本,不支持。不过如果大家有存储过程的方法,可以推荐一下,方法是一样的。

再就是TinyJimmy(Jimmy) 好像没明白我的意思。

#14


有人推荐用关键路径的方法,合适吗?如何来做。

#15


数据量很大的话,可能会很慢。
因为肯定是要遍历所有数据才知道哪个最接近的。

#16


学习

#17


星期一早上继续UP.....

#18


帮UP

#19


可能这样说有的朋友可能不明白,换种方法说就是从一组数中找出接近于一个特定数的最佳组合。如:
一组数:     5 9 2 8 2 3
输入特定数: 10
结果:2  8 


注:是最接近的,(当然,等于是最接近的)。没有等于的时候找最接近的

#20


如果是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的最大值 */
不知道是不是你要的效果!

#21


完全没看明白楼主说的是什么..........

#22


UP

#23


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 ) 

#24


可能我表达能力太差,不好意思。这结果并不只是我列出的两项,而且我说过不只是两项之和,还有可能是2、3、5等等。

#25


越来越糊涂了,劳驾楼主把想解决的问题重新给梳理一下!

#26


通过存储过程来写应该可以

#27


大家不要被我举的例子迷惑,理解这个就可以了。

从一组数中找出和接近于一个特定数的最佳组合。

#28


今天继续顶。。

#29


lcwlyl(网络幽灵) 
大家不要被我举的例子迷惑,理解这个就可以了。

从一组数中找出和接近于一个特定数的最佳组合。

楼主的意思是,不管怎么计算只要结果最近??
就是说两个字段不管通过像加减乘除等运算,只要结果最接近输入的数就行?
还是只要两个字段相加的结果与输入的数据最接近?


#30


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

#31


To:qingoodrar(神吹) 
也可以是最佳组合、次佳组合排列出来。

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

#32


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

#33


路过,忙碌中……  同是五角,友情UP一下,回头再细看

#34


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

#35


学习

#36


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

#37


你的例子是说如果输入7
输出的结果是
id  num
1   5
3    2

1   5
5   2

3    2
5    2
6    3

是这个意思吗?

#38


关注!学习!

#39


学习中,谢谢各位。

#40


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

#41


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

#42


现在有人说这个问题有点类似于背包问题,正在参考。。。。

#43


背包问题可以暂时满足我的需要,但找出最优解还是比较麻烦。大家可以继续讨论。