$tag的值是从外部post来的,都是用;分隔的.$tag     ="第一;三个月;科学;研究;完毕";数据库里有个字段是tag,也就是标签字段例如数据库名是table结构是id              tag                             time  
1               第一;科学                       1291320288 
2               科学;错误;研究;完毕             1291334977
3               第一;研究;失误;                 1291341931
4               三个月;研究;失误;结果           1291552125然后就会用查询更新语句
通过提交的$tag参数
查询table表里的tag字段。。如果被分隔符分开的$tag数据里 有3个同时 跟表里某条记录的 tag字段3个相同
那么就更新这个记录最后执行结果为:
id              tag                             time  
1               第一;科学                       1291320288 
2               第一;三个月;科学;研究;完毕      1291334977
3               第一;研究;失误;                 1291341931
4               三个月;研究;失误;结果           1291552125:)恳请大家指教如何实现这么一个过程..
感谢所有关注这个帖子的朋友

解决方案 »

  1.   

    如果用字符串这么比较比较麻烦,效率也不会很高
    你这个数据中的tag是不是一定要存储成字符串?如果可以存储成整数,那样可以定义几个二进制数来操作,会容易得多。字符串是不是就要一个一个的匹配?我没想到什么办法
      

  2.   

    先求出$tag的所有排列组合。
    $tag ="第一;三个月;科学;研究;完毕";
    $tag的所有排列组合为:
    第一,三个月,科学
    第一,三个月,研究
    第一,三个月,完毕
    第一,科学,研究
    第一,科学,完毕
    第一,研究,完毕
    三个月,科学,研究
    ...这一点请去参考求排列组合的数学公式,我也忘了。将这些组合放在一个二维数组里,按你的需求,每一维有3个tag。然后一个循环
    sql为"select id from table where tag like '%".$tags[$i][0]."%' And tag like '%".$tags[$i][1]."%' And tag like '%".$tags[$i][2]."'"如果返回的结果集不为空,就说明有数据具备这次组合的3个tag,结果集可能是个数组,因为可能有多条数据具备这3个tag,再次循环,从结果集中拿到id,去update。或者你干脆再加个字段,作为tag的字段的区位码形式。将这个字段设置为FULLTEXT将tag中存储的词转成区位码进行存储(MD5也行,不过MD5太长了,GBK汉字的区位码只有8位),也别用;分割了,直接用空格分割。比如第一,三个月,科学存储的区位码就是类似23949322 32143432 43243244。把POST过来的tag也转成区位码形式。不用like,直接MATCH这个区位码字段。做汉字的全文检索。你可知道这个时间复杂度是多少?如果数据量大的话,劝你趁早放弃,去改表结构吧。
      

  3.   


    $array=array(
    0=>array("id"=>1 ,"tag"=>"第一;科学","time"=>"1291320288  "),
    1=>array("id"=>2 ,"tag"=>"科学;错误;研究;完毕","time"=>" 1291334977"),
    2=>array("id"=>3 ,"tag"=>"第一;研究;失误;","time"=>" 1291341931"),
    3=>array("id"=>4 ,"tag"=>"三个月;研究;失误;结果","time"=>" 1291552125"));
    $n=array();
    foreach ($array as $v)
    {
    $n[$v['id']]=explode(";",$v['tag']);
    }
    $tag ="第一;三个月;科学;研究;完毕";
    $arr=explode(";", $tag);
    foreach ($n as $key=>$value)
    {
    if(count(array_intersect($value,$arr))>=3)
    {
    echo "id:".$key;
    }
    }
      

  4.   

    分别用;分割成数组再使用map比较会很快。感觉设计很怪异,标签完全可以独立出来。
      

  5.   


    谢谢,请问我的$array是从 数据库 直接读取 出来的话,语句要怎么写?
    非常感谢
      

  6.   

    select id,tag,time from Table ;
      

  7.   

    总有问题想问.....这样修改tag,如果有两条记录都有3个相同,修改后两条就成为同样的了,是否需要去掉重复的?
    如果不去掉重复的,以后这两条就永远一样了....