$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 第一;科学 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:)恳请大家指教如何实现这么一个过程..
感谢所有关注这个帖子的朋友
你这个数据中的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这个区位码字段。做汉字的全文检索。你可知道这个时间复杂度是多少?如果数据量大的话,劝你趁早放弃,去改表结构吧。
$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;
}
}
谢谢,请问我的$array是从 数据库 直接读取 出来的话,语句要怎么写?
非常感谢
如果不去掉重复的,以后这两条就永远一样了....