添加注释和warning: 总是在数据库中执行任何操作之前进行备份。做一些你不想做的事情很容易就会丢失大量数据,尤其是在处理DELETE
声明。此外,如果数据库使用InnoDB作为数据库引擎,则可以使用transactions 通过BEGIN
, ROLLBACK
, 和COMMIT
.
您的查询已关闭,但您正在指定d
在您的DELETE
子句,该子句将导致中的行wp_term_taxonomy
也要删除。wp_term_taxonomy
是将术语与分类法联系起来的内容,这就是术语从类别中删除的原因。请尝试以下操作:
DELETE
a, -- DELETE from posts
b, -- DELETE from term relationships
c -- DELETE from postmeta
FROM wp_posts a
LEFT JOIN wp_term_relationships b ON ( a.ID = b.object_id )
LEFT JOIN wp_postmeta c ON ( a.ID = c.post_id )
LEFT JOIN wp_term_taxonomy d ON ( d.term_taxonomy_id = b.term_taxonomy_id )
LEFT JOIN wp_terms e ON ( e.term_id = d.term_id )
WHERE e.term_id = 378 AND DATEDIFF(NOW(), post_date) > 400;
这有助于理解WordPress如何存储信息。无论何时创建或更新帖子,都会有三个表受到影响:
wp_posts
很明显,这就是WordPress存储帖子主要记录的地方wp_postmeta
WordPress在其中存储与帖子相关的额外信息wp_term_relationships
定义post类型对象与术语的关联方式
当您想要删除帖子及其所有关系时,应该关注这些表。
最后一点注意:如果您使用代表其表名的别名,这将有助于您更容易理解像这样复杂的查询,当出现问题时,或者当您暂时不查看查询,然后返回查询时。使用更多描述性别名编写的查询示例如下:
DELETE
p, -- DELETE from posts
tr, -- DELETE from term relationships
pm -- DELETE from postmeta
FROM wp_posts p
LEFT JOIN wp_term_relationships tr ON ( p.ID = tr.object_id )
LEFT JOIN wp_postmeta pm ON ( p.ID = pm.post_id )
LEFT JOIN wp_term_taxonomy tt ON ( tt.term_taxonomy_id = tr.term_taxonomy_id )
LEFT JOIN wp_terms t ON ( t.term_id = tt.term_id )
WHERE t.term_id = 378 AND DATEDIFF(NOW(), post_date) > 400;