2010-12-21 54 views
1

我在Wordpress网站有几个框必须显示属于某些类别的帖子的选择,也不属于其他几个。只使用本地WordPress的工具,结果这样的查询:如何简化此Wordpress查询以提高性能?

SELECT SQL_CALC_FOUND_ROWS wp_posts.* 
FROM wp_posts 
INNER JOIN wp_term_relationships 
ON (wp_posts.ID = wp_term_relationships.object_id) 
INNER JOIN wp_term_taxonomy 
ON (wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id) 
WHERE 1=1 
AND wp_term_taxonomy.taxonomy = 'category' 
AND wp_term_taxonomy.term_id IN ('1', '49') 
AND wp_posts.ID NOT IN ( 
    SELECT tr.object_id 
    FROM wp_term_relationships AS tr 
    INNER JOIN wp_term_taxonomy AS tt 
    ON tr.term_taxonomy_id = tt.term_taxonomy_id 
    WHERE tt.taxonomy = 'category' 
    AND tt.term_id IN ('3394', '49', '794', '183')) 
AND wp_posts.post_type = 'post' 
AND (wp_posts.post_status = 'publish') 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_date DESC 
LIMIT 0, 5; 

现在这是相当昂贵的,并最终在慢查询日志。所以我很乐意放弃wordpress方式并手动构建查询。的第一件事是,我可以消除对wp_term_taxonomy表的需要(我可以用term_taxonomy_id代替term_id,我永远无法理解为什么WordPress的同时需要),但我仍然有NOT IT (SUBQUERY)问题,由于类别被排除在外。

所以考虑到我可以自由地做任何事情(如创建其他的“服务”表,如果他们可能会帮助),什么是要加快这些条件下,该搜索的最佳方式?

回答

0

我没有看到子查询的需要,因为它使用的表已经在您的主查询中!因此排除东西应该是向WHERE语句添加更多内容的简单问题。

你不能修改您的订单

AND wp_term_taxonomy.term_id IN ('1', '49') 

AND wp_term_taxonomy.term_id IN ('1', '49') AND wp_term_taxonomy.term_id NOT IN ('3394', '49', '794', '183') 

..和则完全删除子查询?

+0

不,因为我的帖子可能属于被通缉的和不需要的类别,在这种情况下,我必须排除他们。有了这个条款,我只是过滤不需要的类别的行,但帖子仍然会显示,如果它也有一个想要的。 – 2010-12-21 09:49:40

+0

我不确定为什么一篇文章可能是想要的和不想要的,但是你不能使用AND和OR来链接所有这些需求吗?像AND(x IN(1,2)AND(x NOT IN 3,4)或x IN(''))等等。 – Oli 2010-12-21 15:19:40