【问题标题】:Mysql Query for unique slugsMysql查询独特的蛞蝓
【发布时间】:2017-06-09 12:13:00
【问题描述】:

我做了一个wordpress插件来查找和替换数据库中的关键字,其中管理员提供关键字来查找和替换,然后MYSQL查询在数据库中进行更改。
但我只想知道如何避免重复的蛞蝓。
例如:
好像有两个帖子带有以下标签:

  1. 第一次发帖
  2. 第二帖

然后管理员运行查询并希望将“second”替换为“first”。 那么结果将是:

update wp_posts set `post_name` = replace(post_name, 'second','first') where post_type='post'
  1. 第一次发帖
  2. 第一次发帖

有没有办法让蛞蝓保持独特?

【问题讨论】:

  • 到目前为止,最简单的解决方案是添加 unique constraint to the database column 并在发现重复项时捕获引发的错误。
  • 作为@sjdaws 的补充:当唯一约束存在重复条目时,如果我没记错1062,您将得到一个特定的错误代码。将查询放在 try-catch 块中,然后在 catch 中检查错误代码是否等于 1062。
  • 在我看来这是一个混乱的解决方案,它并没有真正实现所要求的 - 即找到一种方法来启用关键字交换并保持 slug 中的唯一性。请参阅下面的解决方案。

标签: php mysql wordpress


【解决方案1】:

此更新查询与派生表一起使用,以检查更改是否会创建重复的 slug。如果是这样,则会在现有 slug 上附加一个数字,以表示可能的重复项。

UPDATE 
  wp_posts p, 

  (SELECT 
     REPLACE(post_name,'second', 'first') AS post_name 
   , COUNT(post_name) AS num_dupes 
   FROM 
     wp_posts WHERE post_type = 'post' 
   GROUP BY 
     REPLACE(post_name, 'second', 'first')) d

SET p.post_name = CONCAT(REPLACE(p.post_name, 'second', 'first'), 
         CASE WHEN num_dupes > 1 THEN num_dupes - 1 ELSE '' END)

WHERE
  p.post_type='post' AND 
  p.post_name = d.post_name

在我看来,这是一个比在 post_name 字段上使用唯一约束更好的解决方案,因为 a)您不需要对 wordpress 数据库进行自定义 DML 更改,b)您可以防止出现重复的问题,并且必须在错误发生之前对其进行处理。

【讨论】:

  • 感谢@Simon 的回答。完全按照我的要求工作。
猜你喜欢
  • 2012-06-13
  • 2012-12-25
  • 1970-01-01
  • 2014-07-30
  • 2016-06-02
  • 2021-04-04
  • 2014-04-02
  • 2016-07-22
  • 2011-02-09
相关资源
最近更新 更多