這里有個需求就是會根據表里的某些字段輸入某值進行匹配而且是模糊匹配,而我們一般的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)
但是在代碼里實現需要根據具體框架和語言來實際操作了;