2012-02-12 41 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