结果为7,那么其实我们想要的就是遍历1到6,分别获取当前位置的字符串:SELECT substring_index(substring_index('1,2,3,4,5,6,7',',', index), ',', -1)
其中index就是我们要遍历的位置,所以为了遍历,我们需要一个关联一个辅助表来得到当前位置,最后的设计如下:
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数据如下:
这里使用到mysql的内置表help_topic_id,里面有508条数据(不同版本数据条数有差别),用户需要有对该表查询的权限才行,这样的话只满足分割数量少于508条的字符串,否则应该自定义辅助表,设置更大的一个递增列
现有如下需求:需要将字符串1,2,3,4,5,6,7拆分成1234567分析:为了完成上述功能,在mysql中提供了一些字符串操作的函数,其中SUBSTRING_INDEX(str, delim, count)str: 要处理的字符串delim: 分割符count: 计数 如果为正数,则从左开始数,如果为负数,则从右开始数
下边的函数,实现了象数组一样去处理字符串。 一,用临时表作为数组 代码如下: create function f_split(@c varchar(2000),@split varchar(2)) returns @t table(col varchar(20)) as begin while(charindex(@split,@c)<>0) begin insert @t(col) values (substring(@c,1,charindex(@split,@c)-1)) set @c = stuff(@c,1,charindex(@split,@c),”) end insert @t
1、通过分隔符可以将其中的内容作为一个整体的字符串进行处理。
假设数据库中有一个表,名为user info,注意这个名字,user 和 info 中间存在一个空格。 如果直接写如下查询,会报错,可能会提示 user 表不存在或者 user 附近有语法错误。
select * from user info;
这时就要用到分隔符,在MySQL中可以使用反单引号“`...
按照指定字符进行合并或拆分是经常碰到的场景,MySQL在合并的写法上比较简单,但是按指定字符拆分相对比较麻烦一点(也就是要多写一些字符)。本文将举例演示如何进行按照指定字符合并及拆分。
1、 合并
MySQL数据库中按照指定字符合并可以直接用group_concat来实现。
创建测试表
mysql> create table tb_group(id int auto_increment primary key ,col1 varchar(20));
Query OK, 0 rows affected (0.01 sec)
插入测试数据
mysql> insert into tb_gr
select account_id,
substring_index(substring_index(a.related_shop_ids,','
,b.help_topic_id+1),',',-1) shopid
sales_hang_account a
mysql.help_topic b
on b.help_topic_id < (length(a.related_shop_ids) - length(replace(a.related_shop_ids,',',''))+1
定义:我们将超过指定时间的SQL语句查询称为“慢查询”。
1、在mysql日志中开启慢查询日志
修改配置文件 在 my.ini 增加几行: 主要是慢查询的定义时间(超过2秒就是慢查询),以及慢查询log日志记录(
slow_query_log)
在mysql命令行中执行命令开启
2、分析慢查询日志
直接分析mysql慢查询日志 ,利用explain关键字可以模拟优化器执行SQL查询语句,来分析sql慢查询语句
例如:执行EXPLAIN SELECT * FROM res_user ORDER BYmodifiedtime L
最近碰到了一个需求,判断当前登录用户是否有权限查看这行数据,数据如表A所示,如果当前用户具有A,D权限,那么他就能查到 列名为(1,2,3,5)这四条数据,因为要分页显示所以用Java去写显得很麻烦,所以用MySql的自定义
函数解决了,代码如下所示:
--------------------------------------------------------------邪恶的分割
在MySQL中,可以使用内置函数SUBSTRING_INDEX和IN语句来实现字符串分割操作。
SUBSTRING_INDEX函数可以按照指定的分隔符将字符串切割成若干份。例如,可以使用以下语句将“abc|def|ghi”这个字符串按照“|”符号分隔成三个部分:
SELECT SUBSTRING_INDEX('abc|def|ghi', '|', 1) AS part1,
SUBSTRING_INDEX(SUBSTRING_INDEX('abc|def|ghi', '|', 2), '|', -1) AS part2,
SUBSTRING_INDEX('abc|def|ghi', '|', -1) AS part3;
上述语句中,第一个函数调用将字符串分隔成第一份,即“abc”;第二个函数调用将字符串分隔成前两份,再将第二份分隔成第二部分,即“def”;第三个函数调用则将字符串分隔成最后一份,即“ghi”。
与此同时,IN语句可以用于判断一个值是否在一组值中。假设有一个包含多个数字的字符串“1,2,3,4,5”,可以使用以下语句查询这个字符串中是否包含数字3:
SELECT IF('3' IN ('1', '2', '3', '4', '5'), 'Yes', 'No') AS result;
上述语句中,IN语句用于判断“3”这个字符串是否在一组数字中(即“1”,“2”,“3”,“4”,“5”)。由于这个字符串中确实包含数字3,因此查询结果会返回“Yes”字符串。
因此,可以将SUBSTRING_INDEX和IN语句结合起来,对一个包含多个值的字符串进行拆分,并查询其中是否包含指定的值。例如可以使用以下语句,在一个包含若干个ID的字符串中查询是否包含ID为3的值:
SELECT IF('3' IN (SUBSTRING_INDEX('1,2,3,4,5', ',', 1),
SUBSTRING_INDEX('1,2,3,4,5', ',', 2),
SUBSTRING_INDEX('1,2,3,4,5', ',', 3),
SUBSTRING_INDEX('1,2,3,4,5', ',', 4),
SUBSTRING_INDEX('1,2,3,4,5', ',', 5)),
'Yes', 'No') AS result;
该语句将“1,2,3,4,5”这个字符串按照“,”逗号进行拆分,并使用IN语句判断3是否在其中。由于这个字符串中确实包含数字3,因此查询结果会返回“Yes”字符串。