如果查询中只有一个特定标记,则对其进行过滤

时间:2012-02-12 09:54:31

标签: mysql wordpress post tags

根据标签查询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

这应查询标签为55的所有帖子。

我需要做的是过滤掉所有仅包含此单个标记但不包含其他标记的帖子。

所以我想要显示一个帖子,如果它有标签23,34,55,67 但我不想显示帖子,如果它有标签55(没有其他标签)。 不包含此特定标记的帖子也应包含在查询中。

我该怎么做?

2 个答案:

答案 0 :(得分:4)

尝试在HAVINGGROUP BY之间添加ORDER BY条件:

...
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。

答案 1 :(得分: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