Mysql中查找逗号分隔的字符串数据-逗号分隔值文件

表中的数据是

+------+------------+

| id | related2 |

+------+------------+

| 1098 | 4979 |

| 1089 | 4980 |

| 1118 | 4979 |

| 1117 | 4980 |

| 4986 | 4980,4979 |

| 4987 | 4979 |

| 4988 | 4980,4979 |

| 4989 | 4979 |

| 4990 | 4979 |

| 4991 | 4980, 4979 |

+------+------------+

要查出所有包含4979的数据,其实挺简单的。

主要用了两个函数:FIND_IN_SET 和REPLACE

FIND_IN_SET(str,strlist)

如果字符串str在由N子串组成的表strlist之中,返回一个1到N的值。一个字符串表是被“,”分隔的子串组成的一个字符串。如果第一个参数是一个常数字符串并且第二个参数是一种类型为SET的列,FIND_IN_SET()函数被优化而使用位运算!如果str不是在strlist里面或如果strlist是空字符串,返回0。如果任何一个参数是NULL,返回NULL。如果第一个参数包含一个“,”,该函数将工作不正常。

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

-> 2

这个函数的问题是逗号中有空格无法识别,所以只能先用REPLACE把空格替换掉。

REPLACE(str,from_str,to_str)

返回字符串str,其字符串from_str的所有出现由字符串to_str代替。

mysql> select REPLACE( 'www.mysql.com ', 'w ', 'Ww ');

-> 'WwWwWw.mysql.com '

所以,最后的where 应该是这样写的,

select id, related2

from table where and FIND_IN_SET( '4979', REPLACE( related2, ' ', ''));

结果

+------+------------+

| id | related2 |

+------+------------+

| 1098 | 4979 |

| 1118 | 4979 |

| 4986 | 4980,4979 |

| 4987 | 4979 |

| 4988 | 4980,4979 |

| 4989 | 4979 |

| 4990 | 4979 |

| 4991 | 4980, 4979 |

+------+------------+

Mysql中查找逗号分隔的字符串数据

Mysql 数据库

推荐阅读