转https://blog.csdn.net/u012009613/article/details/52770567html
现有以下需求:须要将字符串
1,2,3,4,5,6,7
拆分红
1
2
3
4
5
6
7
分析:
为了完成上述功能,在mysql中提供了一些字符串操做的函数,其中SUBSTRING_INDEX(str, delim, count)
str: 要处理的字符串
delim: 分割符
count: 计数 若是为正数,则从左开始数,若是为负数,则从右开始数
例:mysql
str = 'www.baidu.com'; SELECT substring_index('www.baidu.com','.', 1); #www SELECT substring_index('www.baidu.com','.', 2); #www.baidu SELECT substring_index('www.baidu.com','.', -1); #com SELECT substring_index('www.baidu.com','.', -2); #baidu.com SELECT substring_index(substring_index('www.baidu.com','.', -2), '.', 1); #baidu
有了这个函数的帮助,咱们还须要肯定什么呢?须要知道 当前要分割的位置
如何来获取当前要分割的位置呢?咱们能够先获取总共能拆分红多少个字符串
SELECT LENGTH('1,2,3,4,5,6,7') - LENGTH(REPLACE('1,2,3,4,5,6,7', ',', '')) + 1;
结果为7,那么其实咱们想要的就是遍历1到6,分别获取当前位置的字符串:SELECT substring_index(substring_index('1,2,3,4,5,6,7',',', index), ',', -1)
其中index就是咱们要遍历的位置,因此为了遍历,咱们须要一个关联一个辅助表来获得当前位置,最后的设计以下:
sql
SELECT substring_index(substring_index(t.context,',', b.help_topic_id + 1), ',', -1) FROM test.test t join mysql.help_topic b ON b.help_topic_id < (LENGTH(t.context) - LENGTH(REPLACE(t.context, ',', '')) + 1);
其中表test数据以下:
id context
2 1,2,3,4,5,6,7
这里使用到mysql的内置表help_topic_id,里面有508条数据(不一样版本数据条数有差异),用户须要有对该表查询的权限才行,这样的话只知足分割数量少于508条的字符串,不然应该自定义辅助表,设置更大的一个递增列函数
————————————————————————————————————————————————————————————————————————————————————————————————————————spa
自定义辅助表:.net
CREATE TABLE `_help` ( `id` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='辅助表,id需连续而且从0开始';
id大小应大于字段最大‘,’数量设计
例如:1,2,3,4,5 code
‘,’出现4次,则id长度应大于4htm
————————————————————————————————————————————————————————————————————————————————————blog
find_in_set使用
转 http://www.javashuo.com/article/p-hpmcsaiu-dv.html
有个文章表里面有个type字段,它存储的是文章类型,有 1头条、2推荐、3热点、4图文等等 。
如今有篇文章他既是头条,又是热点,仍是图文,type中以 1,3,4 的格式存储。那咱们如何用sql查找全部type中有4的图文类型的文章呢??
这就要咱们的 find_in_set 出马的时候到了。如下为引用的内容:
select * from article where FIND_IN_SET('4',type)