我正在尝试在WordPress中做一个非常具体的事情:超过30天的过期,根据别人的插件没有“喜欢”(或否定的“喜欢”)。该插件在单独的表(+ 1 / -1)中存储每个用户/帖子的个人喜欢/不喜欢,这意味着我的选择标准很复杂,基于SUM。
执行SELECT非常简单,因为它是一个简单的关于帖子ID的JOIN,带有一个“HAVING”子句来检测总喜欢值大于零。它看起来像这样(为了便于阅读,所有的表名都被简化了):
SELECT posts.id, SUM( wti_like_post.value )
FROM posts
JOIN wti_like_post
ON posts.ID = wti_like_post.post_id
WHERE posts.post_date < DATE_SUB(NOW(), INTERVAL 30 DAY)
GROUP BY posts.ID
HAVING SUM( wti_like_post.value ) < 1
但我坚持优化UPDATE查询。未经优化的版本需要2分钟才能运行,这是不可接受的。
UPDATE posts
SET posts.post_status = 'trash'
WHERE posts.post_status = 'publish'
AND posts.post_type = 'post'
AND posts.post_date < DATE_SUB(NOW(), INTERVAL 30 DAY)
AND ID IN
(SELECT post_id FROM wti_like_posts
GROUP BY post_id
HAVING SUM( wti_like_post.value ) < 1 )
这显然是因为我无法使用基于SUM结果的连接创建UPDATE查询 - 我根本不知道该怎么做(相信我,我已经尝试过了!)。
如果有人能为我优化更新,我会非常感激。它还教会我如何正确地做到这一点,这将是整洁的!
提前致谢。
答案 0 :(得分:0)
那么它还取决于没有。对于帖子以及子查询,它将对已删除的帖子ID进行SUM处理,也应该在子查询中进行过滤而不是更新查询尝试这个
UPDATE posts
SET posts.post_status = 'trash'
WHERE ID IN
(
SELECT posts.id
FROM posts
INNER JOIN wti_like_post
ON (posts.ID = wti_like_post.post_id AND posts.post_status = 'publish'
AND posts.post_type = 'post')
WHERE posts.post_date < DATE_SUB(NOW(), INTERVAL 30 DAY)
GROUP BY posts.ID
HAVING SUM( wti_like_post.value ) < 1
)
答案 1 :(得分:-1)
好吧也许听起来很愚蠢,但你可以从选择中创建一个表,在其上放置一个索引,然后只需在该新表上使用标准JOIN进行更新。
我想即使你总是在飞行中这样做,它应该比非索引版本更快。
编辑: 这是代码,sry它是我的头脑没有检查它是否通过但它应该给你至少一个想法我的意思。
CREATE TABLE joinHelper(
id INT NOT NULL,
PRIMARY KEY ( id )
);
INSERT INTO joinHelper(id)
SELECT post_id FROM wti_like_posts
GROUP BY post_id
HAVING SUM( wti_like_post.value ) < 1
UPDATE posts JOIN joinHelper ON (posts.ID = joinHelper.id)
SET posts.post_status = 'trash'
WHERE posts.post_status = 'publish'
AND posts.post_type = 'post'
AND posts.post_date < DATE_SUB(NOW(), INTERVAL 30 DAY)