弄個測試表來說明兩者的區別
CREATE TABLE `test` ( `id` int(8) NOT NULL auto_increment, `name` varchar(255) NOT NULL, `list` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) INSERT INTO `test` VALUES (1, 'name', 'daodao,xiaohu,xiaoqin'); INSERT INTO `test` VALUES (2, 'name2', 'xiaohu,daodao,xiaoqin'); INSERT INTO `test` VALUES (3, 'name3', 'xiaoqin,daodao,xiaohu');
原來以為MySQL可以進行這樣的查詢:
select id, list, name from table where 'daodao' IN (list); (一)
實際上這樣是不行的,這樣只有當name是list中的第一個元素時,查詢才有效,否則都得不到結果,即使'daodao'真的在list中。
再來看看這個:
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); (一)的改進版。
總結:
所以如果list是常量,則可以直接用IN, 否則要用find_in_set()函數。