MySQL简单实现多字段模糊查询
我所做的商城项目前些时提了新需求,要求前台搜索商品除了能通过商品名称搜索到以外,还可以通过别个信息搜索,比如:商品编号、详情内容描述等等,类似于全文搜索了。我首先想到的就是lucene,但是对代码这样的改动量就太大了。。。。目前线上版本如果做这种改动怕测试又出什么幺蛾子,如果又重新建表将这些信息另外存储起来又感觉好麻烦。。。于是就想想在sql语句上面做文章。在网上搜了搜还真有办法。那就是MySQL单标多字段模糊查询。
MySQL单表多字段模糊查询的是指实现在单表中对多字段进行多个关键字的模糊查询,但这数个关键字并不一定都存在于某个字段。当然你多表关联查询也是可以这样弄的。
例如现有table表,其中有title,tag,description三个字段,分别记录一条资料的标题,标签和介绍。然后根据用户输入的查询请求,将输入的字串通过空格分割为多个关键字,再在这三个字段中查询包含这些关键字的记录。
可目前遇到的问题是,这些关键字是可能存在于三个字段中的任意一个或者多个,但又要求三个字段必须包含所有的关键词。如果分别对每个字段进行模糊匹配,是没法实现所需的要求,由此想到两种方法:
在插入记录的同时,将需要进行MySQL单表多字段模糊查询的字段合并成一个字串并加入到一个新的字段中,然后对这个新字段进行模糊查询。
使用全文检索,但是这需要用到中文分词或者将汉字转化为拼音(拆分汉字是不可行的,MySQL默认FT最小字节为4),而且并不利于今后的维护。
《MySQL权威指南》中CONCAT的使用方法,在书中的对CONCAT的描述是:
CONCAT(str1,str2,…)
返回值:由全体出入参数合并在一起而得到的字符串。只要输入的参数中有NULL值,就返回NULL。CONCAT允许只有一个输入参数的情况。
因此,MySQL单表多字段模糊查询可以通过下面这个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 ‘%关键字%’
类似于如此则可以进行简单的多字段模糊搜索了。
相关文章
- MySQL实现排名并查询指定用户排名功能
- MySQL 函数大全
- 【Mysql sql inject】【入门篇】sqli-labs使用 part 4【18-20】
- MySQL在线实现主从配置
- shell安装mysql,连接数据库,创建数据库
- MySQL存储过程实现动态执行SQL
- 使用Talend Open Studio实现mysql数据迁移
- navicat实现Mysql数据备份
- mysql 主主复制(双主复制)+ 配置KEEPALIVED实现热备
- MySQL内核月报 2014.11-MySQL· 捉虫动态·OPTIMIZE 不存在的表
- 数据库内核月报 - 2015 / 09-MySQL · 特性分析 · 5.6 并行复制恢复实现
- Atitit.mysql oracle with as模式临时表模式 CTE 语句的使用,减少子查询的结构性 mssql sql server..
- mysql mysqldump只导出表结构或只导出数据的实现方法
- MySQL索引实现
- MySql 存储过程 退出
- Mysql 中的group by
- MyCAT实现MySQL读写分离
- MySQL_06_事务隔离性的两种实现方式
- 【数据库】mysql 修改最大连接数
- 如何在MySQL 8中实现数据迁移?这里有一个简单易用的方案
- MySQL数据库实现主主同步