这里有个需求就是会根据表里的某些字段输入某值进行匹配而且是模糊匹配,而我们一般的orm很难实现,这里就需要用到mysql的原生sql语句实现,这里后端使用的语言为golang,框架为beego;
目前想到两种方法:
第一种:在插入记录的同时,将需要进行mysql单表多字段模糊查询的字段合并成一个字串并加入到一个新的字段中,然后对这个新字段进行模糊查询,使用全文检索,但是这需要用到中文分词或者将汉字转化为拼音(拆分汉字是不可行的,mysql默认FT 默认最小字节为4),而且并不利于今后的维护;
第二种方式:CONCAT(str1, str2, ....); 返回值: 由全体输入参数合并在一起而得到的字符串,只要输入的参数中有NULL值,就返回NULL,CONCAT允许只有一个输入参数的情况,因此,mysql单表多字段模糊查询可以通过下面这个sql查询实现:
select * from ‘test_table‘ where concat (‘title‘, ‘tag‘, ‘description‘) like ‘%关键字%‘;
但是这样有个问题,如果这三个字段中有值为 NULL , 则返回的也是NULL , 那么这一条记录可能就会被错过,怎么处理呢?使用IFNULL 进行判断:
select * from ‘test_table‘ where concat (ifnull(‘title‘, ‘‘), ifnull(‘tag‘, ‘‘), ifnull(‘description‘, ‘‘)) like ‘%关键字%‘ ;
实际开发中使用:在域名详情里有搜索功能,希望输入的内容可以在多个字段中模糊匹配查询,而不在乎具体输入的内容属于哪个字段的值?
命令行sql语句:
select * from secondlevel_domain_list where concat(ifnull(uniq_domain,‘‘), ifnull(cname,‘‘), ifnull(vip,‘‘), ifnull(owner,‘‘), ifnull(description ,‘‘), ifnull(business ,‘‘)) like ‘%5%‘;
部分代码展示:
total, err := o.Raw("SELECT * FROM secondlevel_domain_list WHERE concat(ifnull(uniq_domain,‘‘), ifnull(cname,‘‘), ifnull(vip,‘‘), ifnull(owner,‘‘), ifnull(description ,‘‘), ifnull(business ,‘‘)) like ? ", "%"+keyword+"%").QueryRows(&sldls)
但是在代码里实现需要根据具体框架和语言来实际操作了;