使用子查询加速JOIN

时间:2016-07-02 14:04:34

标签: mysql

在wordpress数据库中,我想从已撰写至少五篇文章的作者中选择所有已发表的文章,并用他们的登录名替换作者的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上运行了两个选择查询。有没有办法以更有效的方式实现这一目标?

1 个答案:

答案 0 :(得分:2)

我不认为您可以做很多事情来简化查询。但是,你可以做一些事情:

  • 从子查询中删除ORDER BY
  • zwzt_wp_posts(post_type, post_status, post_author)上创建索引。
  • 确保您拥有users(id)上的索引。
  • 确保您在zwzt_wp_posts(post_author)上也有索引。

如果在查询中经常使用此类信息,您可能需要设置触发器以维持用户级别的计数。