在 WordPress 数据库中,我想选择至少撰写了 5 篇文章的作者的所有已发表文章,并将作者的 ID 替换为他们的登录名。我通过选择所有已发布的帖子,使用 JOIN
语句过滤两次,其中一次加入子查询的结果集来获取那些发表超过五篇文章的作者,从而实现了这一目标。
这里我们使用代码:
SELECT posts.post_author, users.user_login, posts.post_content, posts.post_date
FROM zwzt_wp.zwzt_wp_posts AS posts
INNER JOIN zwzt_wp.zwzt_wp_users AS users
ON posts.post_author=users.id
INNER JOIN (
SELECT posts1.post_author, COUNT(*) AS count
FROM zwzt_wp.zwzt_wp_posts AS posts1
WHERE posts1.post_type='post' AND posts1.post_status='publish'
GROUP BY posts1.post_author
HAVING count > 5
ORDER BY posts1.post_author
) as regular_users
ON posts.post_author=regular_users.post_author
WHERE posts.post_type='post' AND posts.post_status='publish'
ORDER BY posts.post_author, posts.post_date DESC;
对我来说,这看起来有点臃肿且运行时间密集,特别是因为我在 posts
上运行了两个选择查询。有什么方法可以更有效地实现这一点吗?
最佳答案
我认为您无法做太多事情来简化查询。但是,您可以做一些事情:
- 从子查询中删除
ORDER BY
。 - 在
zwzt_wp_posts(post_type, post_status, post_author)
上创建索引。 - 确保您在
users(id)
上有索引。 - 确保您在
zwzt_wp_posts(post_author)
上也有索引。
如果此类信息经常在查询中使用,您可能需要设置触发器来维护用户级别的计数。
关于mysql - 使用子查询加速 JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38161017/