2012-02-12 16 views
6

根據自己的標籤查詢WordPress的職位可以是這樣的(如果我一起正確拼湊 - 我刪除從查詢不相關部分):篩選崗位,如果他們只有一個特定的標籤

SELECT wposts.ID AS ID, 
wposts.post_title, wposts.post_status, wposts.post_name, 
tag_terms.term_id AS tag_id 

FROM `wp_posts` AS wposts 

INNER JOIN wp_term_relationships AS tag_term_relationships ON (wposts.ID = tag_term_relationships.object_id) 
INNER JOIN wp_term_taxonomy AS tag_term_taxonomy ON (tag_term_relationships.term_taxonomy_id = tag_term_taxonomy.term_taxonomy_id AND tag_term_taxonomy.taxonomy = 'post_tag') 
INNER JOIN wp_terms AS tag_terms ON (tag_term_taxonomy.term_id = tag_terms.term_id) 

WHERE wposts.ID = '12345' 

AND wposts.post_type = 'post' 

AND wposts.post_status NOT LIKE 'private' 

AND tag_terms.term_id = '55' 

GROUP BY wposts.ID 
ORDER BY wposts.post_date ASC 

這應該查詢標籤ID爲55的所有帖子。

我需要做的是過濾掉所有隻包含這個標籤但沒有其他標籤的帖子。

所以我想顯示一個帖子,如果它有標籤23,34,55,67 但我不想顯示帖子,如果它有標籤55(並沒有其他標籤)。 不包含此特定標記的帖子也應包含在查詢中。

我該怎麼做?

+1

你做錯了。你應該總是選擇WP_query類的帖子:http://codex.wordpress.org/Class_Reference/WP_Query – janw 2012-02-12 09:58:26

+1

我同意@janw,除非你正在開發你自己的插件,你不需要寫一個SELECT語句。 – twilson 2012-02-12 10:03:23

+1

廢話。我需要在同一個查詢中查詢幾個元值,縮略圖,用戶名和標籤。 WP_Query適用於傻瓜,並且不允許我需要的靈活性。 – reggie 2012-02-12 11:00:07

回答

4

嘗試增加GROUP BYORDER BY之間HAVING條件:

... 
GROUP BY wposts.ID 
HAVING COUNT(tag_terms.term_id) <> 1 
    OR MAX(tag_terms.term_id) <> 55 
ORDER BY wposts.post_date ASC 

,改變你的WHERE條件只檢查崗位類型和狀態。

另外,如果您不從wp_terms加入中選擇除tag_id之外的任何內容,則不需要,因爲您可以使用wp_term_taxonomy中的term_id。

+0

謝謝。我從來沒有聽說過HAVING條款。 – reggie 2012-02-14 19:48:51

+0

呃??這個如何工作,選擇'tag_terms.term_id'並在同一時間使用它在子句中 - 我錯過了什麼? – Aprillion 2012-02-20 21:21:40

+0

這裏沒有選擇,我們不知道OP想要選擇什麼,如果他想要標籤,他可能會在名稱上使用GROUP_CONCAT,或者在過濾掉不需要的帖子後再次加入術語。問題中的查詢是完全不同的,具有不同的目的。 – piotrm 2012-02-20 22:27:45

1

如果你想要所有的帖子都帶有特定的標籤,那你爲什麼要在查詢中指定帖子ID?

這下面的查詢將顯示與給定的標籤ID的所有帖子現在

SELECT wposts.ID AS ID, 
wposts.post_title, wposts.post_status, wposts.post_name, 
tag_terms.term_id AS tag_id 

FROM `wp_posts` AS wposts 

INNER JOIN wp_term_relationships AS tag_term_relationships ON (wposts.ID = tag_term_relationships.object_id) 
INNER JOIN wp_term_taxonomy AS tag_term_taxonomy ON (tag_term_relationships.term_taxonomy_id = tag_term_taxonomy.term_taxonomy_id AND tag_term_taxonomy.taxonomy = 'post_tag') 
INNER JOIN wp_terms AS tag_terms ON (tag_term_taxonomy.term_id = tag_terms.term_id) 


WHERE wposts.post_type = 'post' 

AND wposts.post_status NOT LIKE 'private' 

AND tag_terms.term_id = '55' 

GROUP BY wposts.ID 
ORDER BY wposts.post_date ASC 

,如果你想確保這些職位只給定的標籤ID,嵌套查詢,如下所示:

SELECT wposts.ID AS ID, 
    wposts.post_title, wposts.post_status, wposts.post_name, 
    tag_terms.term_id AS tag_id 

    FROM `wp_posts` AS wposts 

    INNER JOIN wp_term_relationships AS tag_term_relationships ON (wposts.ID = tag_term_relationships.object_id) 
    INNER JOIN wp_term_taxonomy AS tag_term_taxonomy ON (tag_term_relationships.term_taxonomy_id = tag_term_taxonomy.term_taxonomy_id AND tag_term_taxonomy.taxonomy = 'post_tag') 
    INNER JOIN wp_terms AS tag_terms ON (tag_term_taxonomy.term_id = tag_terms.term_id) 


    WHERE wposts.post_type = 'post' 

    AND wposts.post_status NOT LIKE 'private' 

    AND tag_terms.term_id = '55' 

    GROUP BY wposts.ID 
    HAVING COUNT(tag_terms.term_id) <> 1 
    OR MAX(tag_terms.term_id) <> 55  
    ORDER BY wposts.post_date ASC 
相關問題