MySQL的find_in_set函数使用方法

发布:2013-01-19 10:40   点击587次   评论:0

http://www.phplover.cn/post/432.html

MySQL 的?find_in_set函数使用方法

Category:技术分享 View: strBatchCount+="spn432=432," Author:燕子

很多时候我们在设计数据库时有这种情况,比如:

有个文章表里面有个type字段,他存储的是文章类型,有 1头条,2推荐,3热点,4图文 .....11,12,13等等

现在有篇文章他既是 头条,又是热点,还是图文,

type中以 1,3,4的格式存储.

那们我们如何用sql查找所有type中有4图文标准的文章呢,

这就要我们的find_in_set出马的时候到了.

先看mysql手册中find_in_set函数的语法:

FIND_IN_SET(str,strlist)

假如字符串str 在由N 子链组成的字符串列表strlist 中,则返回值的范围在 1 到 N 之间。

一个字符串列表就是一个由一些被‘,’符号分开的自链组成的字符串。

如果第一个参数是一个常数字符串,而第二个是type SET列,则?FIND_IN_SET() 函数被优化,使用比特计算。

如果str不在strlist 或strlist 为空字符串,则返回值为 0 。

如任意一个参数为NULL,则返回值为 NULL。这个函数在第一个参数包含一个逗号(‘,’)时将无法正常运行。

mysql> SELECT FIND_IN_SET(''b'',''a,b,c,d'');

-> 2

用起来很简单

就以上面我说到的情况来举例:

以下为引用的内容:

select * from article where FIND_IN_SET(''4'',type)

========================================================= 

http://bbs.csdn.net/topics/360210752

同意楼上,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 = ?的选项就可以了,?根据你所要检索的词最大长度而定。

但如果需要存储中文的话,就比较麻烦了,你需要再加一个字段,以区位码的形式来存储这些值,然后全文检索区位码那一列。


关于 GitHub 导航 部门 反馈

提示:`/home.php`入口数据仅为演示功能,不构成任何交易凭证,也不承担相关风险和责任!

Copyright © 2011-2018 xxxxx.com All rights reserved.

Run:2.351/29.042(ms); 7(sql)/2.886(MB); comm:news/detail; Upd:2025-01-11 11:15:21