首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > Mysql >

算法~

2012-02-07 
求一个算法~~~~我有个这样的数据表, articles下面是文章id号码(mysql数据库)要求结果:根据给定的文章id号

求一个算法~~~~
我有个这样的数据表, articles下面是文章id号码 (mysql数据库)
要求结果:根据给定的文章id号 查出 id values

比如 articles给出的是 5 那么结果应该是 第一行and第三行

  id values articles
  1 aaa 1-2,4-9,37
  2 bbb 23,80
  3 ccc 1-24

[解决办法]
感觉表设计有点问题,比如
1 aaa 1-2,4-9,37

1 aaa 1
1 aaa 2
1 aaa 4
...............
1 aaa 9

这样查询很简单,否则同样要拆分字符串,以,为分隔,取-前后字段内容,再做比较
[解决办法]
如果是要算法应该可以找到,
如果仅限于用SQL语句则很难实现。毕竟这个atricles 字段并不属数据库的范式要求(连1NF都无法满足。)

基于现在这个设计,大家一起看看程序中有什么好的算法。
[解决办法]

SQL code
mysql> select * from text;+----+-------+------------+| id | value | articles   |+----+-------+------------+|  1 | aaa   | 1-2,4-9,37 ||  2 | bbb   | 23,80      ||  3 | ccc   | 1-24       |+----+-------+------------+3 rows in set (0.00 sec)mysql>  select * from text t where id in (select substring(articles,1,instr(articles,",")-1) from t);+----+-------+------------+| id | value | articles   |+----+-------+------------+|  1 | aaa   | 1-2,4-9,37 |+----+-------+------------+1 row in set (0.00 sec)
[解决办法]
http://topic.csdn.net/u/20090727/09/fa250237-de1c-4266-be9a-99e9ac454d44.html

看看这个帖子#24的。我觉得你这个问题貌似跟哪个问题有个类似!
[解决办法]
SELECT `values` FROM (
SELECT newb,a1.values,
IF(INSTR(newb,'-')>0,LEFT(newb,INSTR(newb,'-')-1),newb) AS mi,
IF(INSTR(newb,'-')>0,MID(newb,INSTR(newb,'-')+1,LENGTH(newb)),newb) AS ma
FROM (
SELECT a.*,
MID(MID(newa,b.id,LENGTH(newa)),2,LOCATE(',',MID(newa,b.id,LENGTH(newa)),2)-2) AS newb
 FROM (
SELECT *,CONCAT(',',articles,',') AS newa FROM `test`.tn) a,lsb2 b
WHERE LENGTH(newa)>=b.id
AND MID(newa,b.id,1)=',' 
AND LENGTH(MID(newa,b.id,LENGTH(newa)))>=2
ORDER BY a.values,b.id) a1 ) a2
WHERE 5 BETWEEN mi AND ma


其中LSB2只有ID字段,内容1-1000数字,`test`.tn为工作表
[解决办法]
怎么不能缩进?,再来一遍
C/C++ code
for(i=id第一个,i<=id最后一个,id++){//不遍历是不行的    字符串 strArt=该行articles 。    //when i=1,strArt=1-2,4-9,37     //第1种可能:目标编号==37    将目标编号转换为字符串,在strArt中查找    ,如果有就是找到了,将该id加入结果。    //第2种可能:目标编号==7    for(从strArt第一个字符到最后一个循环,设当前的字符为c)    {        if(c==‘-’)        {            以(字符串前边界,字符串后边界,逗号)为边界,            取c前后的字符,将这个字符串转换为int型得到iBef,iAft。            if(目标编号>iBef and 目标编号<iAft)            {                找到了!将该id加入结果              }        }    }} 

热点排行