mysql查找以逗號分隔的值-find_in_set


需求:有一個表字段很多逗號的值,然后查詢時候傳入一些值,匹配所有數據內包含查詢傳入的這些值的數據

可能你一開始會想到 SELECT * FROM xujiantao WHERE game LIKE ‘%44′ 或者 ’44%’ ‘%44%’, 那么結果可能也會包含444的數據,不太准

一開始我用的正則匹配的,今天無意中發現了另外一個MYSQL函數,廢話不多說了

相信很多人也這么存過,假如有以下表數據:

然后試下LIKE:

它把包含44和包含444的結果都輸出了,而我只想得到44

當然你可以使用正則這么玩:

SELECT * FROM xujiantao WHERE game REGEXP ‘[\d]?,44,’;

比較簡潔一點的,也就是最后要說的用法是FIND_IN_SET函數:

SELECT * FROM xujiantao WHERE FIND_IN_SET(44, game);

同樣沒有把444和888的數據輸出,最終得到了想要的數據

需要注意的是假如你用的是0X, 00X, 000X這樣的數據查找需要加引號,否則找不到

OK,我加了一百多萬的隨機數據,簡單對比一下以上幾種查詢方式的效率

使用LIKE查詢包含22、273、2399、7390的結果,主要看下耗時

1.29秒

使用正則查詢包含22、273、2399、7390的結果

使用FIND_IN_SET查詢包含22、273、2399、7390的結果

以上截圖都是用的InnoDB引擎,game字段加了索引

后來改成MyIsam引擎又測試了下多個不同條件查詢,慢了差不多8%的速度

最后要說的就是FIND_IN_SET函數比LIKE和正則匹配快一些

正則寫起來費勁,還要保證正確性,就算得到精確結果應該也不會太快

FIND_IN_SET比較快一些,OR 4個條件 的結果 LIMIT 20 也才 0.1秒,加個倒序0.4秒

MyIsam引擎:

InnoDB引擎:

原文地址:http://www.xujiantao.com/archives/221


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM