2012-05-24 176 views
0

我有以下MySQL查詢(查詢WordPress的DB):MySQL查詢條件

SELECT wp_posts.ID, wp_posts.post_date, wp_posts.post_content, wp_posts.post_title, wp_terms.name, wp_term_taxonomy.taxonomy 
FROM wp_posts 
LEFT JOIN wp_term_relationships ON (wp_term_relationships.object_id = wp_posts.ID) 
LEFT JOIN wp_term_taxonomy ON (wp_term_taxonomy.term_taxonomy_id = wp_term_relationships.term_taxonomy_id) 
LEFT JOIN wp_terms ON (wp_terms.term_id = wp_term_taxonomy.term_id) 
WHERE 1=1 
AND wp_terms.name != 'MyTagName' 
AND wp_posts.post_type = 'post' 
AND (wp_posts.post_status = 'publish') 
ORDER BY wp_posts.post_date DESC 
LIMIT 100 

我基本上是試圖阻止所有「wp_posts」回來有一個標籤(db表wp_terms)' MyTagName」。但是,以上所有內容似乎都是從返回的行中去除該標記名稱,並將wp_post條目與其標記的其他標記條目相關聯。

任何人都可以幫助我嗎?

回答

1
SELECT wp_posts.ID, wp_posts.post_date, wp_posts.post_content, wp_posts.post_title, wp_terms.name, wp_term_taxonomy.taxonomy 
FROM wp_posts 
JOIN wp_term_relationships ON wp_term_relationships.object_id = wp_posts.ID 
JOIN wp_term_taxonomy ON wp_term_taxonomy.term_taxonomy_id = wp_term_relationships.term_taxonomy_id 
JOIN wp_terms ON wp_terms.term_id = wp_term_taxonomy.term_id 
WHERE NOT EXISTS (
    SELECT 1 
    FROM wp_term_relationships 
    JOIN wp_term_taxonomy ON wp_term_taxonomy.term_taxonomy_id = wp_term_relationships.term_taxonomy_id 
    JOIN wp_terms ON wp_terms.term_id = wp_term_taxonomy.term_id 
    WHERE wp_term_relationships.object_id = wp_posts.ID 
     AND wp_terms.name = 'MyTagName' 
    ) 
    AND wp_posts.post_type = 'post' 
    AND wp_posts.post_status = 'publish' 
ORDER BY wp_posts.post_date DESC 
LIMIT 100 

問題是,您當前的解決方案沒有檢查與帖子相關的所有wp_terms,只是特定的一個。如果有5個條款,其中之一是'MyTagName',那麼單個條款將被排除,但其他4個條款仍將被加入。

現在有關:

AND wp_posts.post_type = 'post' 
AND wp_posts.post_status = 'publish' 

你並不需要把他們在大NOT EXISTS檢查,因爲該職位將不會被無論如何拿起其中任何一項都是假的。

+0

同樣我害怕 - 返回有MyTagName作爲標籤的帖子,只是不會返回包含它的行。 – mootymoots

+0

是的,只是注意到wp_terms表沒有直接鏈接到wp_posts表 - 再次修改答案。 –

+0

很好 - 雖然需要添加:AND wp_posts.post_type ='post' AND(wp_posts.post_status ='publish') – mootymoots