Mysql 使用子查询加速联接

Mysql 使用子查询加速联接,mysql,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

在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;

对我来说,这看起来有点臃肿,而且运行时间很长,特别是因为我在
帖子上运行了两个select查询。有没有更有效的方法来实现这一点?

我认为没有多少方法可以简化查询。但是,你可以做一些事情:

  • 从子查询中删除排序依据
  • zwzt\u wp\u帖子上创建索引(帖子类型、帖子状态、帖子作者)
  • 确保在
    用户(id)
    上有索引
  • 确保你在
    zwzt\u wp\u帖子(post\u author)
    上也有索引

  • 如果在查询中经常使用这种类型的信息,您可能希望设置触发器以在用户级别维护计数。

    我认为您无法简化查询。但是,你可以做一些事情:

    • 从子查询中删除排序依据
    • zwzt\u wp\u帖子上创建索引(帖子类型、帖子状态、帖子作者)
    • 确保在
      用户(id)
      上有索引
    • 确保你在
      zwzt\u wp\u帖子(post\u author)
      上也有索引

    如果在查询中经常使用这种类型的信息,您可能希望设置触发器以在用户级别维护计数。

    回答得好+伟大的答案+1.