文法解釋
FIND_IN_SET(str,strlist)
str是要查詢的字元串或者字段;
strlist可以是字段和字元清單,多個字元串之間必須以逗号分隔,例如:'1,2,e,t'。
這個函數的作用就是查詢strlist中是否包含str,傳回結果為null或記錄。假如字元串str在由N個子鍊組成的字元串清單strlist 中,則傳回值的範圍在 1 到 N 之間;如果str不在strlist 或strlist 為空字元串,則傳回值為 0。例如:
mysql> select find_in_set('s','2,3,s,f,NULL');
+---------------------------------+
| find_in_set('s','2,3,s,f,NULL') |
+---------------------------------+
| 3 |
+---------------------------------+
1 row in set (0.00 sec)
mysql> select find_in_set('vv','2,3,s,f,NULL');
+----------------------------------+
| find_in_set('vv','2,3,s,f,NULL') |
+----------------------------------+
| 0 |
+----------------------------------+
1 row in set (0.00 sec)
mysql> select find_in_set('vv',null);
+------------------------+
| find_in_set('vv',null) |
+------------------------+
| NULL |
+------------------------+
find_in_set()和in的差別
比如有這樣的需求,想要取出findin表的list字段中含有vnhg字元串的資料行:
mysql> select * from findin;
+----+------+----------------+
| id | name | list |
+----+------+----------------+
| 1 | vnhg | bnmj,ewer,vnhg |
| 2 | mnn | vbnj,dkf,vnhg |
+----+------+----------------+
mysql> select * from findin where 'vnhg' in(list);
Empty set (0.00 sec)
上面的SQL是無法實作這個需求,實際上隻有當list字段的值等于'vnhg'時(和in前面的字元串完全比對),查詢才能傳回結果。
使用下面的查詢就可以實作需求:
mysql> select * from findin where find_in_set('vnhg',list);
+----+------+----------------+
| id | name | list |
+----+------+----------------+
| 1 | vnhg | bnmj,ewer,vnhg |
| 2 | mnn | vbnj,dkf,vnhg |
+----+------+----------------+
find_in_set()和like的差別
主要的差別就是like是廣泛的模糊查詢;而 find_in_set() 是精确比對,并且字段值之間用‘,'分開。
以實際的例子來體會:
mysql> select * from findin where find_in_set('vnh',list);
Empty set (0.00 sec)
mysql> select * from findin where list like '%vnh%';
+----+------+----------------+
| id | name | list |
+----+------+----------------+
| 1 | vnhg | bnmj,ewer,vnhg |
| 2 | mnn | vbnj,dkf,vnhg |
+----+------+----------------+