MYSQL - 如果不在类别中并且正则表达式匹配内容,则:(添加到类别并从其他类别中删除)

Posted

技术标签:

【中文标题】MYSQL - 如果不在类别中并且正则表达式匹配内容,则:(添加到类别并从其他类别中删除)【英文标题】:MYSQL - if not in category and regex matches content then: (add to category and delete from other category) 【发布时间】:2021-05-19 14:22:55 【问题描述】:

如果满足条件,我想将帖子添加到一个类别并从另一个类别中删除:正则表达式匹配内容并且不在某个类别中。

所以点数:

动作:

将帖子添加到 A 类 从 B 类中删除这些帖子

如果条件:

帖子内容与某些正则表达式匹配 不属于 C 类

我有两个 sn-ps 的 SQL 代码,我在组合时遇到了麻烦。

---sn-p 1--- 根据帖子中的正则表达式添加到类别------

REPLACE INTO wp_term_relationships (term_taxonomy_id, object_id) SELECT '141',  ID
FROM  `wp_posts` 
   WHERE (post_title REGEXP '((?<!\\b[A-Z]|\\b[A-Z][A-Z])\\$|\\bAU?\\$|CA?N?\\$)[^\\d\\r\\n]?((?:\\d1,10[,. ])*\\d1,10)[ .]?(k)?|((?:\\d1,10[,. ])*\\d1,10)[ .]?(k)? ?(?:USD?\\b|dollar|cash|\\bbucks\\b|GBP|EURO?S?\\b|AUD\\b|CAD\\b|INR\\b)' 
    OR post_content REGEXP '((?<!\\b[A-Z]|\\b[A-Z][A-Z])\\$|\\bAU?\\$|CA?N?\\$)[^\\d\\r\\n]?((?:\\d1,10[,. ])*\\d1,10)[ .]?(k)?|((?:\\d1,10[,. ])*\\d1,10)[ .]?(k)? ?(?:USD?\\b|dollar|cash|\\bbucks\\b|GBP|EURO?S?\\b|AUD\\b|CAD\\b|INR\\b)')
   AND (post_type = 'post' )

---sn-p 2--- 从一个类别中删除另一个类别中的帖子------

DELETE FROM wp_term_relationships 
  WHERE term_taxonomy_id = 160 #@CategoryID
  AND object_id NOT IN 
    (SELECT object_id FROM (SELECT * FROM wp_term_relationships) AS tr2 
       WHERE tr2.term_taxonomy_id = 161); #@OtherCategoryID

sn-p 2 是我能找到的与我想做的事情足够接近的全部。

似乎无法在一个语句中将所有内容一起工作

【问题讨论】:

【参考方案1】:

另一种方法是使用事务。(您必须使用支持它们的表架构,现在您可能会这样做。)

“事务”是一个原子操作:要么是“所有事情都同时发生”(COMMIT),要么是“什么都不做”(ROLLBACK)。现在,在事务中,您可以执行多个查询来完成工作,而其他用户将看不到中间状态。当您提交事务时,他们会立即看到完成的结果——除非他们也在事务的中间。

这是一个故意简单化的解释......但你明白了。现在您不必“在一个查询中完成所有操作”。

【讨论】:

以上是关于MYSQL - 如果不在类别中并且正则表达式匹配内容,则:(添加到类别并从其他类别中删除)的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中的正则表达式

正则表达式:如果某个字符在引号内,则不匹配它

如何在.net正则表达式中找到不在括号内的逗号?

正则表达式有条件不在最小下划线上返回false

shell 正则匹配一条字符串并且获取该字符串中所有匹配到的字符

MySQL高阶语句