2010-12-21 93 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