MySQL简单实现多字段模糊查询【转】

我所作的商城项目前些时提了新需求,要求前台搜索商品除了能经过商品名称搜索到之外,还能够经过别个信息搜索,好比:商品编号、详情内容描述等等,相似于全文搜索了。我首先想到的就是lucene,可是对代码这样的改动量就太大了。。。。目前线上版本若是作这种改动怕测试又出什么幺蛾子,若是又从新建表将这些信息另外存储起来又感受好麻烦。。。因而就想一想在sql语句上面作文章。在网上搜了搜还真有办法。那就是MySQL单标多字段模糊查询。
 
MySQL单表多字段模糊查询的是指实如今单表中对多字段进行多个关键字的模糊查询,但这数个关键字并不必定都存在于某个字段。固然你多表关联查询也是能够这样弄的。
 
例如现有table表,其中有title,tag,description三个字段,分别记录一条资料的标题,标签和介绍。而后根据用户输入的查询请求,将输入的字串经过空格分割为多个关键字,再在这三个字段中查询包含这些关键字的记录。
 
可目前遇到的问题是,这些关键字是可能存在于三个字段中的任意一个或者多个,但又要求三个字段必须包含全部的关键词。若是分别对每一个字段进行模糊匹配,是无法实现所需的要求,由此想到两种方法:
 
在插入记录的同时,将须要进行MySQL单表多字段模糊查询的字段合并成一个字串并加入到一个新的字段中,而后对这个新字段进行模糊查询。 
使用全文检索,可是这须要用到中文分词或者将汉字转化为拼音(拆分汉字是不可行的,MySQL默认FT最小字节为4),并且并不利于从此的维护。 
 
MySQL权威指南》中CONCAT的使用方法,在书中的对CONCAT的描述是:
CONCAT(str1,str2,…)
返回值:由全体出入参数合并在一块儿而获得的字符串。只要输入的参数中有NULL值,就返回NULL。CONCAT容许只有一个输入参数的状况。html

所以,MySQL单表多字段模糊查询能够经过下面这个SQL查询实现sql

SELECT * FROM `magazine` WHERE CONCAT(`title`,`tag`,`description`) LIKE ‘%关键字%’

可是这样有个问题,若是这三个字段中有值为NULL,则返回的也是NULL,那么这一条记录可能就会被错过,怎么处理呢,我这边使用的是IFNULL进行判断,则sql改成:测试

<pre name="code" class="sql">SELECT * FROM `magazine` WHERE CONCAT(IFNULL(`title`,''),IFNULL(`tag`,''),IFNULL(`description`,'')) LIKE ‘%关键字%’

相似于如此则能够进行简单的多字段模糊搜索了。code

文章转自:http://www.javashuo.com/article/p-xbgcbzod-bg.htmlhtm

相关文章
相关标签/搜索