在數據庫中新建一張測試表t_user,包含三個字段'id','name','grilfriend',字段很容易看出,這是記錄一個人的女朋友的表,注意這里的‘firlfriend’字段可以是多個人名,之間用逗號分開,如‘楊冪01,楊冪02’;這樣的數據存儲我們也經常見到。
CREATE TABLE `t_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) CHARACTER SET utf8 DEFAULT NULL, `girlfriend` varchar(255) CHARACTER SET utf8 DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
插入幾條測試數據
INSERT INTO `t_user` VALUES ('1', '狗蛋', '林心如8,安以軒8,范冰冰8'); INSERT INTO `t_user` VALUES ('2', '狗剩', '林心如88,楊冪8,楊穎8'); INSERT INTO `t_user` VALUES ('3', '石頭', '范冰冰88,楊穎88');
數據顯示如下:
下面我想查詢'grilfrind中'包含”楊穎8″是誰的女朋友:
like 查詢:
SELECT * from t_user where girlfriend like '%楊穎8%'
FIND_IN_SET查詢:
SELECT * from t_user where FIND_IN_SET('楊穎8',girlfriend)
下面我想查詢'grilfrind中'包含”楊穎88″是誰的女朋友:
like 查詢:
SELECT * from t_user where girlfriend like '%楊穎88%'
FIND_IN_SET查詢:
SELECT * from t_user where FIND_IN_SET('楊穎88',girlfriend)
結論:like是廣泛的模糊匹配,字符串中沒有分隔符,Find_IN_SET 是精確匹配,字段值以英文”,”分隔,Find_IN_SET查詢的結果要小於like查詢的結果。
附加:函數簡介
FIND_IN_SET(str,strlist)
假如字符串str 在由N 子鏈組成的字符串列表strlist 中, 則返回值的范圍在 1 到N 之間 。一個字符串列表就是一個由一些被‘,’符號分開的自鏈組成的字符串。如果第一個參數是一個常數字符串,而第二個是type SET列,則 FIND_IN_SET() 函數被優化,使用比特計算。如果str不在strlist 或strlist 為空字符串,則返回值為 0 。如任意一個參數為NULL,則返回值為 NULL。 這個函數在第一個參數包含一個逗號(‘,’)時將無法正常運行。