日期:2014-05-16  浏览次数:20886 次

求一个算法~~~~
我有个这样的数据表, 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(arti
cles,",")-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加入结果
              }
        }

    }
}