2012-12-27 162 views
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 

基本上我在这里做是从术语表中获得那个职位的国家,FOLLOWERS_COUNT从wp_postmeta表。所以我们有4个连接表。

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

它现在,但我觉得这可能是因为我选择的所有帖子与它们对应的国家和追随者加以改进,然后再次我查询相同的表从后我选择让追随者的国家和数量(在这种情况下为80),所以我将第一个查询限制在该国家。

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

有没有一种方法来改善这个问题或缩小查询的范围,而不仅仅是性能,我想多了解一点。

回答

0

如果你刚刚学习之后,我会开始把所有的子选择转换成连接。查看'explain extended'的输出,看看优化器对这个查询做了什么 - 然后将它重复为一系列连接。通常,如果不使用子选择,处理速度会更快,更容易。

一些参考:

Here
Here
and Here

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

相关问题