Фильтровать сообщения в запросе, если у них есть только один определенный тег - PullRequest
6 голосов
/ 12 февраля 2012

Запрос сообщений 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 (и других тегов нет).Сообщения, которые не содержат этот определенный тег, также должны быть включены в запрос.

Как это сделать?

Ответы [ 2 ]

4 голосов
/ 12 февраля 2012

Попробуйте добавить 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 условие, чтобы проверять только тип сообщения и статус.

Также, если вы не выбираете ничего, кроме tag_id, из присоединения к wp_terms это необязательно, поскольку вы можете просто использовать term_id из wp_term_taxonomy.

1 голос
/ 15 февраля 2012

Если вам нужны все сообщения с определенным тегом, то почему вы указали идентификатор сообщения в запросе?

Этот следующий запрос покажет все сообщения с данным тегом 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

Теперь, если вы хотите убедиться, что эти сообщения имеют только заданный идентификатор тега, вложите запрос следующим образом:

    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...