0

私は次のMySQLクエリを持っています(wordpress dbをクエリしています):

SELECT wp_posts.ID, wp_posts.post_date, wp_posts.post_content, wp_posts.post_title, wp_terms.name, wp_term_taxonomy.taxonomy
FROM wp_posts
LEFT JOIN wp_term_relationships ON ( wp_term_relationships.object_id = wp_posts.ID ) 
LEFT JOIN wp_term_taxonomy ON ( wp_term_taxonomy.term_taxonomy_id = wp_term_relationships.term_taxonomy_id )
LEFT JOIN wp_terms ON ( wp_terms.term_id = wp_term_taxonomy.term_id) 
WHERE 1=1
AND wp_terms.name != 'MyTagName'
AND wp_posts.post_type = 'post'
AND (wp_posts.post_status = 'publish')
ORDER BY wp_posts.post_date DESC 
LIMIT 100

私は基本的に、タグ(データベーステーブルwp_terms)「MyTagName」を持つすべての「wp_posts」が戻ってくるのを止めようとしています。しかし、上記のすべては、返された行からそのタグ名を取り除き、wp_post エントリをタグ付けされた他のタグ エントリと共にそこに残すだけです。

誰でもこれで私を助けることができますか?

4

1 に答える 1

1
SELECT wp_posts.ID, wp_posts.post_date, wp_posts.post_content, wp_posts.post_title, wp_terms.name, wp_term_taxonomy.taxonomy
FROM wp_posts
JOIN wp_term_relationships ON wp_term_relationships.object_id = wp_posts.ID
JOIN wp_term_taxonomy ON wp_term_taxonomy.term_taxonomy_id = wp_term_relationships.term_taxonomy_id
JOIN wp_terms ON wp_terms.term_id = wp_term_taxonomy.term_id
WHERE NOT EXISTS (
    SELECT 1
    FROM wp_term_relationships
    JOIN wp_term_taxonomy ON wp_term_taxonomy.term_taxonomy_id = wp_term_relationships.term_taxonomy_id
    JOIN wp_terms ON wp_terms.term_id = wp_term_taxonomy.term_id
    WHERE wp_term_relationships.object_id = wp_posts.ID
        AND wp_terms.name = 'MyTagName'
    )
    AND wp_posts.post_type = 'post'
    AND wp_posts.post_status = 'publish'
ORDER BY wp_posts.post_date DESC 
LIMIT 100

問題は、現在のソリューションが投稿に関連するすべての wp_terms をチェックしておらず、特定のものだけをチェックしていることです。5 つの用語があり、そのうちの 1 つが「MyTagName」である場合、その 1 つが除外されますが、残りの 4 つは引き続き結合されます。

今に関して:

AND wp_posts.post_type = 'post'
AND wp_posts.post_status = 'publish'

それらのいずれかが false の場合、その投稿はいずれにせよピックアップされないため、それらを大きな NOT EXISTS チェックに入れる必要はありません。

于 2012-05-24T11:39:23.180 に答える