1. 程式人生 > >mysql 中 find_in_set() 查詢出可變欄位用逗號分隔的目標

mysql 中 find_in_set() 查詢出可變欄位用逗號分隔的目標

有時候我們在設計資料庫時有以下情況,如:

在視訊表中有個欄位week, 他儲存的是視訊在周幾播放,如某視訊只在周1,4,6播放,那麼week欄位對應的值以 1,4,6 的格式儲存

那們我們要用sql查詢所有視訊中周4可以播放的視訊 (這個時候不是用like能解決的,使用like可能查到我們不想要的記錄)

這時就需要 find_in_set()

mysql手冊中find_in_set函式的語法:

FIND_IN_SET(str,strlist) 

假如字串str 在由N 子鏈組成的字串列表strlist 中,則返回值的範圍在 1N 之間。一個字串列表就是一個由一些被‘,'符號分開的自鏈組成的字串。如果第一個引數是一個常數字符串,而第二個是

type SET列,則 FIND_IN_SET() 函式被優化,使用位元計算。如果str不在strlist 或strlist 為空字串,則返回值為 0 。如任意一個引數為NULL,則返回值為 NULL

mysql> SELECT FIND_IN_SET('b','a,b,c,d');
-> 2 

mysql> SELECT *  from video  where find_in_set('4',week); 

like是廣泛的模糊匹配,字串中沒有分隔符,find_in_set是精確匹配,欄位值以英文”,”分隔,

注意 find_in_set 是全表掃描的

再例如:

如果我們在開發中個,需要取出指定的某些資訊,可以通過 {dede:arclist flag=’h’} ,擴充套件使用,就是可以把管理員 推薦或是置頂的資訊,取出.
在mysql中,我們經常有這樣一個需求:比如:


friendlist表


id    name     friendsList 
1    aaa       11,112,113
2    bbb       123,3112


需求是: 請查詢出好友包含  11的這個使用者id


想法:

select * from friendlist where friendList like ‘%11%’;
實際我們可以這樣解決
select * from friendlist where find_in_set(‘11’,friendList);