全球主机交流论坛

标题: 求一条mysql语句,批量清除无效内容 [打印本页]

作者: Hellonet    时间: 2021-3-5 16:54
标题: 求一条mysql语句,批量清除无效内容
本帖最后由 Hellonet 于 2021-3-5 16:59 编辑

pre_forum_post 表里面 其中一个字段 message 内 有多个不规则的内容

如下:


这中间的数字是不规则的,0-99999* 都有 这些数字是图片地址,但图片已失效了,帖子是空白的,所以想清理掉。

(正常输出空白了),就像下面这样

[attach]31887[/attach]
[attach]31888[/attach]
[attach]31889[/attach]
[attach]318810[/attach]

现在只知道discuz批量替换关键词的语句是 UPDATE pre_forum_post SET message=REPLACE(message,'存在的旧词组','替换后的词组');

怎么删除所有帖子里面的 [attach]*[/attach]  代码,保留其他正常文字内容。

求一条语句批量清空 谢谢!



作者: tiane12    时间: 2021-3-5 17:02
先备份数据,然后试试truncate 表名

作者: 小白鸡    时间: 2021-3-5 17:05
用PHP正则吧
作者: Hellonet    时间: 2021-3-5 17:06
tiane12 发表于 2021-3-5 17:02
先备份数据,然后试试truncate 表名

大佬,好像不行,这个命令是删除这个表的所有内容
我想要实现这样
删除所有帖子里面的 [attach]*[/attach] 代码  * 是任意数字,不知道有没有通配符什么的,我不懂操作

需要保留帖子的其他正常内容。
作者: feeeei    时间: 2021-3-5 17:13
UPDATE pre_forum_post SET message=null WHERE message REGEXP '^[attach][0-9]+[/attach]$';
作者: Ruclinux    时间: 2021-3-5 17:17
正则数字
作者: Hellonet    时间: 2021-3-5 17:20
feeeei 发表于 2021-3-5 17:13
UPDATE pre_forum_post SET message=null WHERE message REGEXP '^$';

谢谢大佬,不过还是不对,执行后提示 影响了 0 行。
那个代码还在
作者: 518    时间: 2021-3-5 17:39
本帖最后由 518 于 2021-3-5 17:56 编辑

UPDATE pre_forum_post SET message=REPLACE(message,SUBSTRING(message,LOCATE('[attach]',message),LOCATE('[/attach]',message)),'');

上面错了
这个应该差不多
UPDATE pre_forum_post SET message=REPLACE(message,SUBSTRING(message,LOCATE('[attach]',message),LOCATE('[/attach]',message)-LOCATE('[attach]',message)+9),'');
作者: Hellonet    时间: 2021-3-5 17:42
feeeei 发表于 2021-3-5 17:13
UPDATE pre_forum_post SET message=null WHERE message REGEXP '^$';

大佬,能否再麻烦你一下,可能我表达的不清楚

message=null 的意思是不是为空的意思?我帖子是有其他需要保留的文字的,例如资源描述和网盘下载地址

替换不成功是不是跟这个null有关系,我不懂怎么写,麻烦大佬再帮我一次,谢谢
作者: 月の天使    时间: 2021-3-5 17:42
数据量不大,可以来个最没效率的做法,fetch_all后挨个update
作者: Hellonet    时间: 2021-3-5 17:43
Ruclinux 发表于 2021-3-5 17:17
正则数字

麻烦了,能否告诉我怎么写,楼上大佬写的这条命令 执行不成功
UPDATE pre_forum_post SET message=null WHERE message REGEXP '^[attach][0-9]+[/attach]$';
作者: Hellonet    时间: 2021-3-5 17:49
518 发表于 2021-3-5 17:39
UPDATE pre_forum_post SET message=REPLACE(message,SUBSTRING(message,LOCATE('',message)),'');


啊~~ 感谢!已经完美解决,
作者: 518    时间: 2021-3-5 17:50
Hellonet 发表于 2021-3-5 17:49
啊~~ 感谢!已经完美解决,

别介  错了
作者: Ruclinux    时间: 2021-3-5 17:51
Hellonet 发表于 2021-3-5 17:43
麻烦了,能否告诉我怎么写,楼上大佬写的这条命令 执行不成功
UPDATE pre_forum_post SET message=null  ...

  1. UPDATE pre_forum_post SET message=null WHERE message REGEXP '^[attach]^([1-9]{0,1}[0-9]{1,9})$[/attach]
  2. ;
复制代码


试一下这个, [0-9] 就是匹配数字的。
作者: Hellonet    时间: 2021-3-5 18:07
518 发表于 2021-3-5 17:50
别介  错了

刚刚看到你说错了,我抽取了部分帖子查看,有部分没有被替换,然后对比了两条命令。

执行后都有效,但两条命令的共同点都是 需要执行多次 而不是 一次性清楚所有
作者: Hellonet    时间: 2021-3-5 18:18
Ruclinux 发表于 2021-3-5 17:51
试一下这个, [0-9] 就是匹配数字的。

谢谢大佬,不过不行,执行后提示 影响0行,查看帖子没有被替换
楼上有大佬给出两条命令,可以清楚,但需要重复执行多次,每次好像是随机清理了几十个内容
作者: Ruclinux    时间: 2021-3-5 19:00
本帖最后由 Ruclinux 于 2021-3-5 19:02 编辑
Hellonet 发表于 2021-3-5 18:18
谢谢大佬,不过不行,执行后提示 影响0行,查看帖子没有被替换
楼上有大佬给出两条命令,可以清楚,但需 ...


1、首先,我不知道那条数字库命令是不是适用,我不太了解数据库命令。
2、正则匹配数字的写法有很多,你可以搜索一下“正则匹配数字”,把匹配代码添加进数据库清理命令里就可以了。
3、请做好备份。

UPDATE pre_forum_post SET message=null WHERE message REGEXP '^[attach]\d[0-9]|\d{4}+|[0-9]{4}+\d{[0-9]}[/attach]$';

你再试一下这样可不可以
作者: Hellonet    时间: 2021-3-5 19:28
Ruclinux 发表于 2021-3-5 19:00
1、首先,我不知道那条数字库命令是不是适用,我不太了解数据库命令。
2、正则匹配数字的写法有很多,你 ...

  谢谢大佬提供帮助
的确,有时候没有实际操作环境,很难知道命令对不对,你这条命令我试了报错,如果你亲自操作的话,修改一下就搞定了,谢谢大佬啦,下次有遇到其他问题再麻烦你
目前就使用上面那两条,执行多次后全部清理完成了





欢迎光临 全球主机交流论坛 (https://443502.xyz/) Powered by Discuz! X3.4