想请教一个问题 求高手指点 本帖最后由 zmzkkk 于 2011-05-12 15:37:56 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 一般另外做一个表,俗称key-value式多一个表就算复杂的话那以后还怎么继续! 为什么不呢? MySQL 不是已提供了 find_in_set 函数吗? 如今我现在情况是, 有几种服务,服务1,服务2,服务3,服务4,还有一个其他. 用户填表时通过 check 多选框选择,本来我是自己定义一个数组, array('服务1','服务2','服务3','服务4') 入数据库的时候就保存数组的下标, 可是现在问题是,要求如果用户点击‘其他’ 的时候,用户可以输入文字,这段文字该如何保存,新建一个表?? 还是把原来保存服务这个字段,改为varchar型 . 即使是前面几个服务1,2,3,4也直接保存字符串,可是这样做又感觉不太好,将来如果不要把服务1 的名字改来其他,就麻烦了。 如果查询频繁,最好新建一个表1对多存储。虽然可以用FIND_IN_SET(),但是效率不高;如果只用来记录,不用来SQL查询,无所谓。 同意楼上,FIND_IN_SET效率和LIKE差不多。至于使用哪种结构,要看你的存储的那些值是否经常改变。其实有一种办法我经常用,但条件是你那些需要记录的值的数量,不要超过32个或64个(视你的cpu位数而定)假如我要存储的值有:a,b,c,d,e如果按照常规方法存3个值,你大概会类似这样存:a,c,e或a|c|e我可以建立一个list:$list = array('a' => 1,'b' => 2,'c' => 4,'d' => 8,'e' => 16);当我需要存储a,c,e3个值时,我只需存储1+4+16的和21,只需要存储1个21,就可以知道,这个值中包括了a,c,e这三个值。如何知道?foreach( $list as $v ){ if( (int)(21 & $v) == $v){ $items[] = $v; }}var_dump($items);其实这个类似于linux的权限管理,采用按位与操作。不过这个你可以看一下这个序列,那个每次以^2递增,所以会变得很大,一旦超过你cpu的所能计算的最大二进制位,就会溢出了。所以对于你这个需求,其实还有种方法可以用。前面按你说的,用|或,把所有值存储在一起,但是检索的时候,使用全文检索,不要使用LIKE或FIND_IN_SET。如果你里面存储的值没有中文的话,只需要在my.cnf里面增加一个ft_min_word_len = ?的选项就可以了,?根据你所要检索的词最大长度而定。但如果需要存储中文的话,就比较麻烦了,你需要再加一个字段,以区位码的形式来存储这些值,然后全文检索区位码那一列。 php文本编辑框 让图片每行显示三张,然后循环输出文件夹中的图片 写一个匹配用户名的正则,解决后散分 谢谢 apache和tomcat整合的问题 php 怎样读取word,excel,pdf, (包括文字段落格式) 怎么清楚用ob_flush输出的内容 不知道搜索引擎是如何做到的,有了解这种算法的朋友出来指教一下 谁帮我加注释 我看不懂 给解释下 如何利用PHP实现QQ秀功能!!~送分100!~~~在线等!~~~分即送!!~ 急!简单问题百分相送,在线等 strrpos查找字符串结果出错,请教 php搜索功能
假如我要存储的值有:
a,b,c,d,e如果按照常规方法存3个值,你大概会类似这样存:a,c,e或a|c|e
我可以建立一个list:
$list = array(
'a' => 1,
'b' => 2,
'c' => 4,
'd' => 8,
'e' => 16
);当我需要存储a,c,e3个值时,我只需存储1+4+16的和21,只需要存储1个21,就可以知道,这个值中包括了a,c,e这三个值。如何知道?
foreach( $list as $v ){
if( (int)(21 & $v) == $v){
$items[] = $v;
}
}var_dump($items);其实这个类似于linux的权限管理,采用按位与操作。
不过这个你可以看一下这个序列,那个每次以^2递增,所以会变得很大,一旦超过你cpu的所能计算的最大二进制位,就会溢出了。所以对于你这个需求,其实还有种方法可以用。前面按你说的,用|或,把所有值存储在一起,但是检索的时候,使用全文检索,不要使用LIKE或FIND_IN_SET。如果你里面存储的值没有中文的话,只需要在my.cnf里面增加一个
ft_min_word_len = ?的选项就可以了,?根据你所要检索的词最大长度而定。
但如果需要存储中文的话,就比较麻烦了,你需要再加一个字段,以区位码的形式来存储这些值,然后全文检索区位码那一列。