根据标签查询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(没有其他标签)。 不包含此特定标记的帖子也应包含在查询中。
我该怎么做?
答案 0 :(得分:4)
尝试在HAVING
和GROUP 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