例如表: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表达式完成
具体还是要找个教优算法!
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 = ***)
数据量不打得话 试试:
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)可以一直进行下去
反正,这样做的结果就是:数据量大的情况下,你的机器保证变蜗牛!
(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
from table a, table b
where a.id<>b.id
select id1, id2, min(abs(num-10)) from #tmp
#13
存储过程不能写,因为我现在用的Mysql较低版本,不支持。不过如果大家有存储过程的方法,可以推荐一下,方法是一样的。
再就是TinyJimmy(Jimmy) 好像没明白我的意思。
再就是TinyJimmy(Jimmy) 好像没明白我的意思。
#14
有人推荐用关键路径的方法,合适吗?如何来做。
#15
数据量很大的话,可能会很慢。
因为肯定是要遍历所有数据才知道哪个最接近的。
因为肯定是要遍历所有数据才知道哪个最接近的。
#16
学习
#17
星期一早上继续UP.....
#18
帮UP
#19
可能这样说有的朋友可能不明白,换种方法说就是从一组数中找出接近于一个特定数的最佳组合。如:
一组数: 5 9 2 8 2 3
输入特定数: 10
结果:2 8
注:是最接近的,(当然,等于是最接近的)。没有等于的时候找最接近的
一组数: 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的最大值 */
不知道是不是你要的效果!
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
是这个意思吗?
输出的结果是
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表达式完成
具体还是要找个教优算法!
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 = ***)
数据量不打得话 试试:
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)可以一直进行下去
反正,这样做的结果就是:数据量大的情况下,你的机器保证变蜗牛!
(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
from table a, table b
where a.id<>b.id
select id1, id2, min(abs(num-10)) from #tmp
#13
存储过程不能写,因为我现在用的Mysql较低版本,不支持。不过如果大家有存储过程的方法,可以推荐一下,方法是一样的。
再就是TinyJimmy(Jimmy) 好像没明白我的意思。
再就是TinyJimmy(Jimmy) 好像没明白我的意思。
#14
有人推荐用关键路径的方法,合适吗?如何来做。
#15
数据量很大的话,可能会很慢。
因为肯定是要遍历所有数据才知道哪个最接近的。
因为肯定是要遍历所有数据才知道哪个最接近的。
#16
学习
#17
星期一早上继续UP.....
#18
帮UP
#19
可能这样说有的朋友可能不明白,换种方法说就是从一组数中找出接近于一个特定数的最佳组合。如:
一组数: 5 9 2 8 2 3
输入特定数: 10
结果:2 8
注:是最接近的,(当然,等于是最接近的)。没有等于的时候找最接近的
一组数: 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的最大值 */
不知道是不是你要的效果!
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
是这个意思吗?
输出的结果是
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
背包问题可以暂时满足我的需要,但找出最优解还是比较麻烦。大家可以继续讨论。