typecho 在mysql中去掉重复数据 - typecho 查重、去重

操作前请先备份数据,有啥问题小弟不负责哈。。。。。

去重

最近利用typecho建了一个网站,后端用了pyspider爬虫来填写部分内容,后来多次重启爬虫程序导致mysql出现重复数据。最后不得不将mysql中重复的数据去掉。下面这个只是简单根据标题是否一样来判断是否有重复内容。具体代码:

delete `typecho_contents`
   from `typecho_contents`
  inner join (
     select max(cid) as lastId, title
       from `typecho_contents`
      group by `title`
     having count(*) > 1) duplic on duplic.title = typecho_contents.title
  where typecho_contents.cid < duplic.lastId;

上面这段代码只去掉typecho_contents中重复的内容,如果你的typecho有自定义字段或者tags和分类,这些是去掉不了的。
对了,上面这些操作需要在mysql中的query操作。


去重,更新(2020年1月21日):

这个更新版本是根据标题和创建时间来判断是否有重复内容。

删除typecho_fields的自定义字段

  delete `typecho_fields` 
from 
    `typecho_fields` 
    inner join (
        select 
            max(cid) as lastId, 
            title, 
            cid, 
            created 
        from 
            `typecho_contents` 
        group by 
            `title`, 
            `created` 
        having 
            count(*) > 1
    ) duplic on duplic.cid = typecho_fields.cid 
where 
    typecho_fields.cid < duplic.lastId

删除typecho_relationships的cid记录

  delete `typecho_relationships` 
from 
    `typecho_relationships` 
    inner join (
        select 
            max(cid) as lastId, 
            title, 
            cid, 
            created 
        from 
            `typecho_contents` 
        group by 
            `title`, 
            `created` 
        having 
            count(*) > 1
    ) duplic on duplic.cid = typecho_relationships.cid 
where 
    typecho_relationships.cid < duplic.lastId

最后再删除typecho_contents的重复内容

delete `typecho_contents` 
from 
    `typecho_contents` 
    inner join (
        select 
            max(cid) as lastId, 
            title, 
            created 
        from 
            `typecho_contents` 
        group by 
            `title`, 
            `created` 
        having 
            count(*) > 1
    ) duplic on duplic.title = typecho_contents.title 
    and duplic.created = typecho_contents.created 
where 
    typecho_contents.cid < duplic.lastId;

查重

如果只是想简单查重的话,下面代码可以实现:

版本一

只根据标题title来判断是否重复内容

select `title`
        from `typecho_contents`
       group by `title`
      having count(*) > 1

版本二

根据标题title创建时间created来判断是否重复内容。
为啥会有这个呢?有时候爬虫的时候会重复爬,是标题和创建时间都一样。

select `title`,`created`
        from `typecho_contents`
       group by `title`,`created`
      having count(*) > 1

参考:MySQL delete duplicate records but keep latest

评论

4 条

joker

代码放到那呢,谢谢

回复 ·

在mysql里面操作,里面有一个选项叫query,直接放上去就可以。 我经过N次操作,没有啥问题

回复 ·

能放到后台发布文章标题上吗?让每一个文章不重复

回复 ·

这个要在php上改代码了..没有需求,暂不弄这个

回复 ·

添加新评论