根據用戶輸入的關鍵字(中英文區別,)然后根據關鍵字進行匹配,根據匹配度高低進行排序
SELECT * FROM gt_poi where
cn_name like CONCAT('%','${cnName}','%' ) or
en_name like CONCAT('%','${enName}','%' )
ORDER BY REPLACE(cn_name,'${cnName}','')
MySQL REPLACE字符串
REPLACE(str,old_string,new_string);
mysql 模糊查詢
mysql 中一般使用like 來進行模糊查詢,但like 的效率非常的低,容易導致全表掃描,因此不推薦使用。
那有木有其他的方法代替like來進行模糊查詢呢?
替代方法肯定是有的,以下是幾個可替代like 進行模糊查詢的 關鍵詞
- instr
- locate
- position
- find_in_set
下面簡單介紹下各個方法的使用情況
測試對象 content 表
SELECT COUNT(mlzm_content.id) FROM mlzm_content
數據量: 33034 條信息
LIKE
SELECT id,Title from mlzm_content WHERE Title LIKE '%美女%'
結果:294 條記錄
耗時: 0.0130 秒
SELECT id,Title from mlzm_content WHERE Title LIKE '%模特%'
結果:10 條記錄
耗時: 0.0550 秒
結論:但查詢到結果集的數據量少的時候like耗時會增加,即總數據量不變,結果越少耗時約大
INSTR
語法:INSTR(str, substr)
SELECT id,title from mlzm_content WHERE INSTR(Title,'美女')>0;
結果:294 條
耗時:0.0150 秒
INSTR(str, substr) 與LOCATE(substr, str) 類似,只是參數的位置變了
LOCATE
語法:LOCATE(substr, str)
SELECT id,title from mlzm_content WHERE LOCATE('美女',Title)>0;
結果:294 條
耗時: 0.0150 秒
SELECT id,title from mlzm_content WHERE LOCATE('模特',Title)>0
結果:10條
耗時: 0.0760 秒
普通用法:
SELECT `column` from `table` where locate('keyword', `condition`)>0
類似 js 的 indexOf(); locate() (返回的結果為子串在字符串中第一次出現的位置,因為從1開始計數,因此只要匹配結果均大於0),沒有查找到才返回0;
指定位置查找:
SELECT LOCATE('bar', 'foobarbar',5); --> 7 (從foobarbar的第五個位置開始查找)
返回 'bar' 在 'foobarbar' 第一次出現的位置(這里限制了從第5位后面開始查找,因此結果為7),位置下標是從1開始計數的。
POSITION
語法:POSITION(substr IN str)
SELECT id,title from mlzm_content WHERE POSITION('美女' IN Title);
結果:294 條
耗時: 0.0150 秒
小結:LOCATE()、POSITION()、INSTR()類似,執行效率前2這基本一致,INSTR()要比前2這稍微快一點。但3者的執行效率都要比like 的略低。
(可能是數據量不大,真實的效率有待考察,后續會利用大數據來進行效率測試后再做定論。這里的效率問題並不是一定用哪個就要好,一切都要根據實際需求測試后再做定論。)
語法:FIND_IN_SET(str, strlist)
SELECT id,title from mlzm_content WHERE FIND_IN_SET('美女',Title);
結果:1 條
耗時: 0.0470 秒
SELECT id,title from mlzm_content WHERE FIND_IN_SET('模特',Title)
結果:1 條
耗時: 0.0460 秒
SELECT FIND_IN_SET('b','a,b,c,d');
耗時: 0.0020 秒