今天在做項目時,看到了一個從沒見過的MySQL函數——FIND_IN_SET(),頓時就產生了濃郁的興趣,然后就搜了搜,翻了翻。
語法:FIND_IN_SET(str,strlist)
定義:
1. 假如字符串str在由N子鏈組成的字符串列表strlist中,則返回值的范圍在1到N之間。
2. 一個字符串列表就是一個由一些被‘,’符號分開的自鏈組成的字符串。
3. 如果第一個參數是一個常數字符串,而第二個是typeSET列,則FIND_IN_SET()函數被優化,使用比特計算。
4. 如果str不在strlist或strlist為空字符串,則返回值為0。
5. 如任意一個參數為NULL,則返回值為NULL。這個函數在第一個參數包含一個逗號(‘,’)時將無法正常運行。
strlist:一個由英文逗號“,”鏈接的字符串,例如:"a,b,c,d",該字符串形式上類似於SET類型的值被逗號給鏈接起來。
示例:SELECT FIND_IN_SET('b','a,b,c,d'); //返回值為2,即第2個值
一篇較詳細的文章:http://blog.sina.com.cn/s/blog_5b5460eb0100e5r9.html
mysql中的 IN和FIND_IN_SET的查詢問題
原來以為mysql可以進行這樣的查詢
select id, list, name from table where 'daodao' IN (list); (一)
注:1. table含有三個字段id:int, list:varchar(255), name:varchar(255)
實際上這樣是不行的,這樣只有當'daodao'是list中的第一個元素(我測試的時候貌似是第一個也是不行的,只有當list字段的值等於daodao時才是對的)時,查詢才有效,否則都的不到結果,即使'daodao'真的在list中
1 | name | daodao,xiaohu,xiaoqin | |||
2 | name2 | xiaohu,daodao,xiaoqin | |||
3 | name3 | xiaoqin,daodao,xiaohu |
再來看看這個:
select id, list, name from table where 'daodao' IN ('libk', 'zyfon', 'daodao'); (二)
這樣是可以的
---------------------------------------------------------
這兩條到底有什么區別呢?為什么第一條不能取得正確的結果,而第二條卻能取得結果。
原因其實是(一)中 (list) list是變量, 而(二)中 ('libk', 'zyfon', 'daodao')是常量
所以如果要讓(一)能正確工作,需要用find_in_set():
select id, list, name from table where FIND_IN_SET( 'daodao' , list); (一)的改進版。
mysql> SELECT FIND_IN_SET('b','a,b,c,d'); -> 2 延伸用法,利用FIND_IN_set排序 eg: $ids = '9,3,45,1,8,2,6';
|