WordPress 的 MySQL 查询:每个类别至少 100 个帖子 - 删除其余的

问题描述

我想要一个 sql 语句,该语句将删除每个类别中除 100 个最新帖子之外的所有帖子。

这看起来很简单 - 但是许多帖子存在于多个类别中,因此删除一个类别上的帖子编号 101 可能会删除一个类别的帖子编号 89。

我曾尝试使用 MysqL 的“LIMIT”,但在子查询中不允许使用。所以我尝试将 ROW_NUMBER() OVERrownumber >= 100 一起使用,它在子查询中有效 - 但给出了错误的结果。

所以这适用于选择早于过去 100 的类别中的所有帖子:

SELECT * FROM (
  SELECT
    ROW_NUMBER() OVER (ORDER BY wp_posts.post_date DESC) AS rownumber
  FROM wp_posts
  WHERE (wp_posts.ID IN (SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id IN (71) ) ) 
AND (wp_posts.post_type = 'post' OR wp_posts.post_type = 'xdays1')  
) AS foo
WHERE rownumber >= 100

得到正确数量的结果,29,602。

但是当我把它放在另一个查询中时,结果是错误的:

SELECT wp_posts.*
FROM  wp_posts 
   WHERE 
wp_posts.ID IN

(SELECT * FROM (
  SELECT
    ROW_NUMBER() OVER (ORDER BY wp_posts.post_date DESC) AS rownumber
  FROM wp_posts
  WHERE (wp_posts.ID IN (SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id IN (71) ) ) 
AND (wp_posts.post_type = 'post' OR wp_posts.post_type = 'xdays1')  
) AS foo
WHERE rownumber >= 100)

结果只有 10 行。 此测试仅针对一个类别,我想针对所有类别执行此测试 - 所以我想如果我可以在子查询中进行此测试,我就可以添加其他类别。

我做错了什么?

解决方法

设法让它工作。这是使用 ID 为 71、72、73、74 的四个类别

SELECT wp_posts.*
FROM  wp_posts 
   
WHERE 

(wp_posts.post_type = 'post' AND wp_posts.post_status = 'publish')   
   
AND

-- posts discluded if under 100 most recent per category:
(

( wp_posts.ID NOT IN (SELECT ID FROM (SELECT ID,ROW_NUMBER() OVER (ORDER BY wp_posts.post_date DESC) AS rownumber
  FROM wp_posts
  WHERE (wp_posts.ID IN (SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id IN (71) ) ) 
AND (wp_posts.post_type = 'post' AND wp_posts.post_status = 'publish')  
) AS foo
WHERE rownumber <= 100
) 
)

AND

( wp_posts.ID NOT IN (SELECT ID FROM (SELECT ID,ROW_NUMBER() OVER (ORDER BY wp_posts.post_date DESC) AS rownumber
  FROM wp_posts
  WHERE (wp_posts.ID IN (SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id IN (72) ) ) 
AND (wp_posts.post_type = 'post' AND wp_posts.post_status = 'publish')  
) AS foo
WHERE rownumber <= 100
) 
)

AND

( wp_posts.ID NOT IN (SELECT ID FROM (SELECT ID,ROW_NUMBER() OVER (ORDER BY wp_posts.post_date DESC) AS rownumber
  FROM wp_posts
  WHERE (wp_posts.ID IN (SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id IN (73) ) ) 
AND (wp_posts.post_type = 'post' AND wp_posts.post_status = 'publish')  
) AS foo
WHERE rownumber <= 100
) 
)

AND

( wp_posts.ID NOT IN (SELECT ID FROM (SELECT ID,ROW_NUMBER() OVER (ORDER BY wp_posts.post_date DESC) AS rownumber
  FROM wp_posts
  WHERE (wp_posts.ID IN (SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id IN (74) ) ) 
AND (wp_posts.post_type = 'post' AND wp_posts.post_status = 'publish')  
) AS foo
WHERE rownumber <= 100
) 
)

)