0

我正在使用 Wordpress 和 MySQL,我有以下查询

SELECT COUNT(p.ID)
FROM wp_posts AS p
    LEFT JOIN wp_postmeta AS t1
       ON t1.post_id = p.ID
         AND t1.meta_key = 'followers_count' 
    LEFT JOIN
       (SELECT tt.term_id,tr.object_id
        FROM wp_term_relationships AS tr
          INNER JOIN wp_term_taxonomy AS tt
             ON tt.term_taxonomy_id = tr.term_taxonomy_id
               AND tt.taxonomy='paises'
       ) as terms
         ON p.ID=terms.object_id 
    INNER JOIN
        (SELECT meta_value,tt.term_id
         FROM wp_postmeta AS t1 
          LEFT OUTER JOIN wp_term_relationships AS tr
             ON t1.post_id=tr.object_id
          INNER JOIN wp_term_taxonomy AS tt
             ON tt.term_taxonomy_id = tr.term_taxonomy_id
               AND tt.taxonomy='paises'
         WHERE t1.post_id = 80
            AND t1.meta_key = 'followers_count'
       ) AS f
          ON p.post_type='post'
             AND p.post_status='publish'
             AND t1.meta_value>f.meta_value
             AND terms.term_id=f.term_id

基本上我在这里做的是从术语表中获取帖子国家,从 wp_postmeta 表中获取 follower_count。所以我们有 4 个连接表。

我想使用followers_count获得该帖子在指定国家/地区的排名,这是最后一个子查询。

它现在可以工作了,但我觉得它可以改进,因为我正在选择所有帖子及其对应的国家和追随者,然后我再次查询相同的表以从我选择的帖子中获取国家和追随者数量(在此为 80 case) 所以我将第一个查询限制在那个国家。

我尝试了临时表,但我不能在同一个查询中多次使用它,而且 MySQL 中不存在 CTE,所以我这样做了。

有没有办法改进这一点或缩小查询一点,而不是我想学习更多的性能。

4

1 回答 1

0

如果您刚刚学习,那么我将从将所有子选择转换为连接开始。看一下“explain extended”的输出,看看优化器对这个查询做了什么——然后将它作为一系列连接重复。如果您不使用子选择,通常处理起来会更快、更容易。

几个参考:

这里
这里

注意 - 这不是 100% 的规则 - 您的里程可能会有所不同。

于 2012-12-27T14:55:41.880 回答