programing

특정 태그가 하나만 있는 경우 쿼리의 게시물 필터링

newstyles 2023. 9. 26. 22:03

특정 태그가 하나만 있는 경우 쿼리의 게시물 필터링

워드 프레스 게시물을 태그에 따라 쿼리하는 것은 다음과 같이 보일 수 있습니다(정확하게 정리한 경우 - 쿼리에서 관련 없는 부분을 제거했습니다.

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 태그(그리고 다른 태그는 없음)가 있으면 게시물을 보여주고 싶지 않습니다.이 특정 태그를 포함하지 않는 게시물도 쿼리에 포함되어야 합니다.

이거 어떻게 해요?

추가해 보기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를 사용할 수 있으므로 필요하지 않습니다.

특정 태그가 있는 모든 게시물을 원한다면, 왜 쿼리에 게시물 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

언급URL : https://stackoverflow.com/questions/9247901/filter-posts-in-a-query-if-they-have-only-one-certain-tag