WordPress

SQL处理WordPress中的重复文章

LensNews

采集发布到Wordpress中的文章,很多会出现重复标题,或者标题为空的情况。 这时,可以使用SQL来直接删除。

 

标题为空的情况

标题为空的情况相对比较简单,直接使用delete语句,将标题为空的文章筛选出来并删除就行了。

DELETE
FROM
	wp_posts
WHERE
	wp_posts.post_title = ''#此处为空
AND 
	wp_posts.post_type='post'
AND
	wp_posts.post_status='publish';

 

其他情况

在标题不为空的情况下,就相对比较复杂了。这个时候需要使用到子查询。

一般的话,在删除前,应该先查询一下文章的重复情况。即按文章标题进行分组,然后筛选出重复标题大于1的文章和数量

这是可以使用以下语句,查询重复情况:

SELECT
	wp1.post_title "文章标题",
	count( wp1.post_title ) "文章数量" 
FROM
	wp_posts wp1 
WHERE
	wp1.post_type = "post" 
	AND wp1.post_status = "publish" 
GROUP BY
	wp1.post_title 
HAVING
	count( wp1.post_title )> 1 
ORDER BY
	count( wp1.post_title ) DESC

然后再运行一下SQL,删除其中的重复文章:

原理很简单。就是把检查使用的SQL生成的虚拟表再作为条件(标题重复文章数大于1)找出所有重复文章的标题的集合,凡是在这个集合里面的标题的文章都会被删除。但是存在一个弊端,即会删除所有有重复的文章。

DELETE 
FROM
	wp_posts 
WHERE
	wp_posts.post_title IN (
	SELECT
		pt1 
	FROM
		(
		SELECT
			wp1.post_title AS pt1 
		FROM
			wp_posts wp1 
                WHERE
	          wp1.post_type = "post" 
	          AND wp1.post_status = "publish"    
                 GROUP BY
			wp1.post_title 
		HAVING
			count( wp1.post_title )> 1 
		ORDER BY
			count( wp1.post_title ) DESC 
		) AS t 
	);

 

 

 

 

 

 

 

 

 

因此我们采用另外一种方式:

用重复文章的唯一ID进行分组和删除,而不是标题。这样每次生成的删除条件集合一次性取出来的都是唯一的。运行一次只会删除一部重复文章,反复运营直到删除的条数为0时,则所有重复文章均被删除多余的文章。

DELETE 
FROM
	wp_posts 
WHERE
	wp_posts.id IN (
	SELECT
		pid 
	FROM
		(
		SELECT
			wp1.id AS pid 
		FROM
			wp_posts wp1 
		WHERE
			wp1.post_type = "post" 
			AND wp1.post_status = "publish" 
		GROUP BY
			wp1.post_title 
		HAVING
			count( wp1.post_title )> 1 
		ORDER BY
			count( wp1.post_title ) DESC 
		) AS t 
	);

 

 

(0)

本文由 SilenceLee的学习笔记 作者:silencelee 发表,转载请注明来源!

LensNews

热评文章

发表回复